Frogs HDU - 5514

题意:

有n个青蛙,第 i 个青蛙每次只能够跳 ai​步,现在有m个石头围成一圈,编号为0到m−1,现在青蛙可以围着这个石头组成的圆跳无限次,每跳一次就会占领这个石头,可以无限占领,现在问你的是这n个青蛙占领的石头的编号的总和是多少。

题解:

参考博客
肯定和容斥有关,但本人很无擅长容斥,所以不会。。。

第一个方法(欧拉函数):

对于第i个青蛙,他所能跳的步长为gi=gcd(m,ai),也就是所有编号为gi的倍数的石头,他都能占领
现在有多个青蛙,就会存在一些位置被重复占领,所有我们要考虑容斥,为了消除这些重复的值,我们规定第i个石头只能由gcd(m,i)的步长来占领,例如环长为12,那么就有:
2,10 只能由步长为 2 的来占领;
3 , 9只能由步长为 3 的来占领;
4 , 8 只能由步长为 4 的来占领;
6 只能由步长为 6 的来占领;
这些步长都是<m的m的因子因子组成,我们先预处理出所有因子,然后判断该因子是否能被gcd(m,ai)中得一个整除(比如gcd=2,那么步长为2,4,6得都可以实现)
由步长为x所占石头的编号和为:
步长为2:2+10=2 * (1+5) = 2 * (phi[6] * 6/2)
步长为3:3+9=3 * (1+3)
步长为4:4+8=4 * (1+2)
步长为6:6=6 * 1
对于步长为x的求和就是x * (与m/x互素的个数的和),括号内的数是与m/x互质的数,因为gcd(m,ai)=gcd(12,9)=3,提出3后,gcd(4,3)等于1,所以3与12/3互质
结论:
在[1,x]中与x互素的数的和为:phi[x] * x/2(欧拉函数得性质)
整理得:x * phi[m/x] * m/2 * 2 = phi[m/x] * m/2
求和即可

第二个方法(容斥做法):

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> G,fac;//G为所谓的”步长“   fac为因子
int getPhi(int n){int m = (int)sqrt(n+0.5);int ans = n;for(int i = 2;i <= m;i++){if(!(n%i)){ans = ans/i*(i-1);while(!(n%i)) n /= i;}}if(n > 1) ans = ans/n*(n-1);return ans;
}
int main(){int T;cin>>T;for(int TT = 1;TT <= T;TT++){cout<<"Case #"<<TT<<": ";fac.clear();G.clear();int n,m,x,tag = 0;cin>>n>>m;for(int i = 0;i < n;i++){cin>>x;int g = __gcd(x,m);if(g == 1)tag = 1;G.push_back(g);}if(tag){cout<<1ll*m*(m-1)/2<<endl;continue;}sort(G.begin(),G.end());n = unique(G.begin(),G.end()) - G.begin();//去重int mm = sqrt(m+0.5);for(int i = 2;i <= mm;i++){if(!(m%i)){fac.push_back(i);if(i*i != m) fac.push_back(m/i);}}ll ans = 0;for(int i = 0;i < fac.size();i++){for(int j = 0;j < n;j++){if(!(fac[i]%G[j])){ans += 1ll*getPhi(m/fac[i])*m/2;break;}}}cout<<ans<<endl;}return 0;
}

Frogs HDU - 5514相关推荐

  1. HDU 5514 容斥原理

    题意 传送门 HDU 5514 题解 对于青蛙 iii,每一步即在模 mmm 意义上增加 aia_iai​,那么当青蛙走回起点 000 时,有 ai×step=0modma_i\times step= ...

  2. hdu 5514 容斥

    hdu 5514 题意:有n个青蛙编号1~n,m块石头编号0~m-1,石头围成一圈,每只青蛙会从第ii块跳到第(i + ai) mod m(i \ + \ a_i) \ mod \ m块,青蛙会跳无数 ...

  3. HDU 5514 Frogs (容斥原理)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...

  4. HDU 5514 Frogs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514 题目描述: 有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过 ...

  5. HDU 5514 Frogs 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=5514 没有想到怎么利用gcd的性质来改进指数级别的容斥,还是没有理解容斥的思想,只知道基础的. 已经知道结果就在 ...

  6. HDU 5514 Frogs 欧拉函数

    题意: 有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\). 现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4 ...

  7. HDU 5514 Frogs(欧拉函数+数论YY)

    传送门 Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  8. HDU 5514 Frogs (容斥原理+因子分解)

    题目链接 题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0 ...

  9. HDU - 5514 Frogs(容斥原理)

    题目链接:点击查看 题目大意:给出 0 ~ m - 1 共 m 个石头首尾相连呈现出一个环状,初始时在第 0 个石头上有 n 只青蛙,n 只青蛙相互独立,每一只青蛙每次都会向前跳 a[ i ] 步,问 ...

最新文章

  1. 为什么 sin(x²)+sin(y²)=1 的图像这么复杂?
  2. Vue-Layout:可视化布局、自动生成代码工具
  3. 本地事务和分布式事务工作实践
  4. UOJ #35. 后缀排序 后缀数组 模板
  5. linux文件系统启动流程,linux 内核启动过程以及挂载android 根文件系统的过程
  6. php 浮点型float 强转int php金额计算 php元转分
  7. Python排序算法之快速排序
  8. mysql按中文拼音字母排序_解析MySQL按常规排序、自定义排序和按中文拼音字母排序的方法...
  9. 深度学习博士灵魂拷问:我们在做算法还是在调参?
  10. jupyter notebook怎么画决策树图_状态图怎么画?图文详解快速上手UML图
  11. php-mvc模式(2)
  12. 阿里云原生专家禹杨杨:详解容器的发展、周边生态和落地实践
  13. r9270公版bios_换个BIOS再来一次
  14. 系统——现有centos7操作系统制作为iso镜像文件
  15. Scrapy 爬取今日头条街拍图片
  16. typedef 的使用方法详解、goto语句的使用方法。
  17. 北航991——设备管理(重点)
  18. SSD算法理解(1)
  19. 原生JS获取QQ好友列表
  20. [转] 找到一个与VR相关的博客

热门文章

  1. 颠覆认知!完美赌徒,到底是如何用数学打造经济神话?!
  2. 苹果手机透明桌面_原来苹果手机辨别真假很容易!查看桌面1个图标,就能轻松分辨...
  3. 中止是怎么用的_多士炉怎么用 使用多士炉注意事项
  4. jsoup 获取html中body内容_jsoup实现java抓取网页内容
  5. excel怎么在柱状图上加超链_如何让你的年终总结更符合领导心意,高薪员工必备的excel技能...
  6. 背包(二维数组版和一维数组版)
  7. 蓝桥杯2015初赛-方程整数解-枚举
  8. 获取壁纸设置背景android,【Android学习】获取Bing 15天前到明天的壁纸,并设置为背景...
  9. vue.js中mock本地json数据
  10. 数据结构与算法--解决问题的方法-顺时针打印矩阵