题意:有m个石头围成一圈,编号分别为0到m-1,现在有n只青蛙,都在0号石头上,第i只青蛙会从当前编号为p的石头跳到编号为(p+ai)%m的石头上。被青蛙经过的石头都会被占领,求这m块石头中所有被占领过的石头的编号和。

题解:对于第i只青蛙,它所能跳到的最小的位置是gcd(ai, m)

设最小位置为z,需要跳x圈,跳了y步,可得方程:x*m+z=ai*y

即:x*m-ai*y = z  由扩展欧几里得定理可知,z的最小整数解为gcd(m,ai)

因为对于单独的每一只青蛙计算结果会重复计算,所以利用容斥对每一个m的因子计算。

首先对于每一个x=gcd(ai,m),如果m的一个因数fac%x==0,那么fac就会被跳到。

然后对于每一个会碰到的因数计算,当m的一个因数j的因数i被计算的时候,j就会被重复计算,要减去。

虽然题解很有道理,但是我想了好久也没明白容斥不是奇加偶减吗,怎么这么算了= =

后来搜题解明白了此题gcd太多,二进制枚举会爆longlong,dfs也会超时,http://www.acmtime.com/?p=864 一个神奇的剪枝。

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. const int N = ;
  10. int fac[N], cnt;
  11. int cc[N];
  12.  
  13. void cal(int x) {
  14. cnt = ;
  15. int limit = sqrt(x);
  16. fac[cnt++] = ;
  17. for (int i = ; i < limit; ++i) {
  18. if (x % i == ) fac[cnt++] = i, fac[cnt++] = x/i;
  19. }
  20. if (limit*limit == x) fac[cnt++] = limit;
  21. else if (x % limit == ) fac[cnt++] = limit, fac[cnt++] = x/limit;
  22. sort(fac, fac+cnt);
  23. }
  24.  
  25. int main()
  26. {
  27. int T, cas = ;
  28. int n, m;
  29. scanf("%d", &T);
  30. while (T--) {
  31. printf("Case #%d: ", ++cas);
  32. scanf("%d%d", &n, &m); //1e4 1e9
  33. cal(m);
  34. memset(cc, , sizeof cc);
  35. int ai;
  36. for (int i = ; i < n; ++i) {
  37. scanf("%d", &ai);
  38. int gcd = __gcd(ai, m);
  39. for (int i = ; i < cnt; ++i) {
  40. if (fac[i] % gcd == ) cc[i] = ;
  41. }
  42. }
  43. long long ans = ;
  44. for (int i = ; i < cnt; ++i) {
  45. if (cc[i] == ) continue;
  46. long long tmp = (m-) / fac[i];
  47. ans += tmp * (tmp+) / * fac[i] * cc[i];
  48. for (int j = i+; j < cnt; ++j) {
  49. if (fac[j] % fac[i] == ) cc[j] -= cc[i];
  50. }
  51. }
  52. printf("%lld\n", ans);
  53. }
  54. return ;
  55. }

hdu5514-Frogs(容斥原理)好题的更多相关文章

  1. HDU5514 Frogs

    /* HDU5514 Frogs http://acm.hdu.edu.cn/showproblem.php?pid=5514 容斥原理 * * */ #include <cstdio> ...

  2. 【做题】hdu5514 Frogs——另类容斥

    题意是给出n个m的约数,问[0,m-1]中至少被其中一个约数整除的整数和.(n<=10000,m<=1000000000) 直接容斥的话,是2^n再拖个log的复杂度,加上当前的数大于m时 ...

  3. hdu4135Co-prime 容斥原理水题

    //问一个区间[a,b]与n互素的数的个数 //利用容斥原理可知 //在[a,b] 区间内对n的素数因子 //ans = 被一个数整除的数的个数 - 被两个数的最小公倍数整除的数的个数 + 被三个数的 ...

  4. 从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)

    The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the ...

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

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

  6. HDU 5514 Frogs (容斥原理)

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

  7. hdu 6021 MG loves string (一道容斥原理神题)(转)

    MG loves string    Accepts: 30    Submissions: 67  Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  8. hdu 4235 容斥原理模板题

    题目大意: 输入样例个数T,每个样例输入三个数a,b,n,求[a,b]之间与n互素的个数 基本思路: 互斥,想想这个:AUBUC=A+B+C-A∩B-A∩C-B∩C+A∩B∩C fac存的是n的素因数 ...

  9. poj 2773(容斥原理)

    容斥原理入门题吧. Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9798   Accepted: 3 ...

  10. 【BZOJ2005】【NOI2010】能量采集(莫比乌斯反演,容斥原理)

    [BZOJ2005][NOI2010]能量采集(莫比乌斯反演,容斥原理) 题面 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量 ...

随机推荐

  1. RIA技术

    Rich Internet Application(富互联网应用程序,简称RIA),一种全新的Web应用程序架构,它结合了桌面软件良好的用户体验和web应用程序易部署的优点,很快获得了企业的青睐. 近 ...

  2. 内存分配(c/c++)

    C++中内存分配          内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1,栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的 ...

  3. 【笨嘴拙舌WINDOWS】消息机制

    如果将WINDOWS比做一个人,那么他就是为你提供各种服务的巫师,他手上有各式各样,奇形怪状的奇葩物品.他脑子充满了智慧,能够为你解决你所不能解决的疑难杂症.但是他不认识你! 你从小立志要想考状元,去 ...

  4. POJ 2774 (后缀数组 最长公共字串) Long Long Message

    用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中. #include <cstdio> #include <cs ...

  5. Asp.net中的HttpModule和HttpHandler的简单用法

    在Asp.net中,HttpModule和HttpHandler均可以截取IIS消息进行处理,这使得我们制作人员能够非常方便的进行诸如图片水印添加,图片盗链检查等功能. 下面先就HttpModule的 ...

  6. 事件对象event和计时器

    事件对象:event 属性: srcElement事件源对象 keyCode 键盘按键Ascii码 window方法: 定时器: 1)setTimeout();//n毫秒后执行一次 2)setInte ...

  7. 【Python】logging模块学习笔记

    因为做接口自动化测试遇到的一个代码逻辑上的问题,又不知道具体问题出在哪里,所以在模块化代码之前,先学习下python的日志模块logging. 入门1 入门2 日志级别大小关系为:CRITICAL & ...

  8. 标准IO库函数复习

    打开文件,打开文件一定要成对写,养成好习惯很重要.比如 fopen()fclose<ol> <li>fopen()</li> <pre lang=" ...

  9. 虚拟机VMware tools作用以及其安装

    虚拟机VMware tools的作用(1). 更新虚拟机中的显卡驱动, 使虚拟机中的XWindows可以运行在SVGA模式下.在客户操作系统中安装Mware Tools非常重要.如果不安装VMware ...

  10. distinguish and differentiate

    According to Cambridge Dictionary distinguish:to recognize or understand the difference between two ...