题目链接:传送门

题目需求:Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.(2<=N<=1000000000, 1<=M<=N),

题目解析:

求(X,N),不用想要分解N的因子,分解方法如下,我一开始直接分解for(int i=2;i<=n/2;i++),这样的话如果n==10^9,那么直接超时,因为这点失误直接浪费了一中午

的时间,要这么分解for(int i=2;i*i<=n;i++)具体请在代码里面看,然后开始求(X,N)>=M。

这才是核心:

要求有多少个 i 满足gcd(i, N) = d(1<=i<=N)
如果gcd(i, N) = d,则gcd(i/d, N/d) = 1
由于i <= N,所以 i/d <= N/d,转化为求多少个不大于N/d的数与N/d互质,而这就是欧拉函数
所以有phi(N/d)个 i 满足gcd(i, N) = d,所以求gcd(i,N)>=M,就是求N的因子中大于等于M的欧拉函数值,

即gcd(N/d1)+gcd(N/d2)+...+gcd(N/dn),其中di>=M,且为N的因子。

直接写:(都是15ms,这是后台数据的问题,数据多了肯定还是打表快)

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <math.h>
  6. typedef __int64 ll;
  7. using namespace std;
  8. ll n,m,sum,top,key,M,coun,i;
  9. int f[];
  10. int main()
  11. {
  12. int T;
  13. scanf("%d",&T);
  14. while(T--)
  15. {
  16. sum=;
  17. top=;
  18. scanf("%I64d%I64d",&n,&m);
  19. for(i=; i*i<n; i++)
  20. {
  21. if(n%i==)
  22. {
  23. f[top++]=i;
  24. f[top++]=n/i;
  25. }
  26. }
  27. if(i*i==n)//千万别忘了这一句,如16=4*4
  28. {
  29. f[top++]=i;
  30. }
  31. sort(f,f+top);
  32. key=-;
  33. for(i=; i<top; i++)
  34. {
  35. if(f[i]>=m)
  36. {
  37. key=i;
  38. break;
  39. }
  40. }
  41. if(key==-)
  42. {
  43. printf("1\n");
  44. continue;
  45. }
  46. for(i=key; i<top; i++)
  47. {
  48. M=n/f[i];
  49. coun=n/f[i];
  50. for(ll z=; z*z<=M; z++)
  51. {
  52. if(M%z==)
  53. {
  54. coun-=coun/z;
  55. M/=z;
  56. while(M%z==)
  57. M/=z;
  58. }
  59. }
  60. if(M!=) coun-=coun/M;
  61. sum+=coun;
  62. }
  63. printf("%I64d\n",sum);
  64. }
  65. return ;
  66. }

一部分欧拉值打表:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <math.h>
  6. typedef __int64 ll;
  7. using namespace std;
  8. ll n,m,sum,top,key,i;
  9. int phi[],f[];
  10. void init()
  11. {
  12. memset(phi,,sizeof(phi));
  13. phi[]=;
  14. for(int i=; i<=; i++)
  15. {
  16. if(!phi[i])
  17. {
  18. for(int j=i; j<=; j=j+i)
  19. {
  20. if(!phi[j]) phi[j]=j;
  21. phi[j]-=phi[j]/i;
  22. }
  23. }
  24. }
  25. }
  26. int main()
  27. {
  28. int T;
  29. scanf("%d",&T);
  30. init();
  31. while(T--)
  32. {
  33. sum=;
  34. top=;
  35. scanf("%I64d%I64d",&n,&m);
  36. for(i=; i*i<n; i++)
  37. {
  38. if(n%i==)
  39. {
  40. f[top++]=i;
  41. f[top++]=n/i;
  42. }
  43. }
  44. if(i*i==n)
  45. {
  46. f[top++]=i;
  47. }
  48. sort(f,f+top);
  49. for(i=; i<top; i++)
  50. {
  51. if(f[i]>=m)
  52. {
  53. key=i;
  54. break;
  55. }
  56. }
  57. if(key==-)
  58. {
  59. printf("1\n");
  60. continue;
  61. }
  62. for(ll i=key; i<top; i++)
  63. {
  64. if(n/f[i]<=)
  65. {
  66. sum+=phi[n/f[i]];
  67. continue;
  68. }
  69. ll M=n/f[i];
  70. ll coun=n/f[i];
  71. for(ll z=; z*z<=M; z++)
  72. {
  73. if(M%z==)
  74. {
  75. coun-=coun/z;
  76. M/=z;
  77. while(M%z==)
  78. M/=z;
  79. }
  80. }
  81. if(M!=) coun-=coun/M;
  82. sum+=coun;
  83. }
  84. printf("%I64d\n",sum);
  85. }
  86. return ;
  87. }

大神博客:http://hi.baidu.com/bg1995/item/ef25e3261f584053c38d59a8

HDU2588:GCD(欧拉函数的应用)的更多相关文章

  1. hdu2588 gcd 欧拉函数

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  3. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  4. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  5. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  6. BZOJ2818: Gcd 欧拉函数求前缀和

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...

  7. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  8. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 1695 GCD (欧拉函数,容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  10. hdu 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. listView解决滑动时黑色背景问题

    listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...

  2. 超全面的JavaWeb笔记day23<AJAX>

    AJAX AJAX概述 1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言 ...

  3. 07python之字符串的常用方法

    字符串作为python中常用的数据类型,掌握字符串的常用方法十分必要. 常用知识点: 1.字符串的3种格式化方法 2.字符串的strip()方法 3.字符串的join()方法 4.字符串可以切片 1. ...

  4. ionic简单路由及页面传参

    1)页面跳转及传参方法 angular.module('app.routes', [])//routes路由模型 .config(function($stateProvider, $urlRouter ...

  5. Unity 的OCulus VR开发遇到的坑---OC版本差异

    我作为Unity新人,没有用过Unity5之前的任何版本,不熟悉任何操作.所以,就根据官方推荐,使用了5.1.1版本,然后根据官方版本对应推荐,果断选择下载了PC端的OC的0.6.0.1版本,对应的U ...

  6. brocadcastReceiver

    用来接收广播, 可以根据系统发生的一些时间做出一些处理 系统的一些事件,比如来电,来短信,等等,会发广播:可监听这些广播,并进行一些处理: Android3.2以后,为了安全起见,对于刚安装的应用,需 ...

  7. 使用reactjs遇到Warning: setState(...): Can only update a mounted or mounting component.

    前端数据大部分来源于后端,需要向后端发起异步请求,而在使用reactjs的时候,如果这个组件最初加载的时候就发起这个异步请求,然后在返回结果中进行setState({}),这时候有可能会遇到这个警告: ...

  8. 剑指offer练习

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.  public c ...

  9. 谷歌Volley网络框架讲解——第一篇

    自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...

  10. JZOJ.5328【NOIP2017模拟8.22】世界线

    Description