zoukankan      html  css  js  c++  java
  • HDU2588 GCD(欧拉函数)

    题目问[1,n]中与n的gcd大于等于m的数的个数。

    好难想。。。

    假设x满足条件,那么gcd(x,n)=d>=m,而x/d与n/d一定互质。

    又x<=n,所以x/d<=n/d。

    于是gcd(x,n)=d的x个数就等于小于n/d且与n/d互质的个数,即phi(n/d)。

    不同的d对应的x肯定会不重复,因为它们与n的gcd本来就不同。那么就是枚举最大公约数d,累加phi(n/d)就是答案了。

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int phi(int x){
     5     int y=x;
     6     for(int i=2; i*i<=x; ++i){
     7         if(x%i) continue;
     8         while(x%i==0) x/=i;
     9         y-=y/i;
    10     }
    11     if(x!=1) y-=y/x;
    12     return y;
    13 }
    14 int main(){
    15     int t,n,m;
    16     scanf("%d",&t);
    17     while(t--){
    18         scanf("%d%d",&n,&m);
    19         int res=0;
    20         for(int i=1; i*i<=n; ++i){
    21             if(n%i) continue;
    22             int j=n/i;
    23             if(i>=m) res+=phi(j);
    24             if(i!=j && j>=m) res+=phi(i);
    25         }
    26         printf("%d
    ",res);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    学了axure的感受
    axure的功能
    PS的应用
    day15-1 模块
    day14-2 模块详解
    day14-1 模块定义,导入
    day13-1 Json & pickle 数据序列化
    day12-3 内置方法
    day12-2 内置方法
    day12-1 迭代器和生成器
  • 原文地址:https://www.cnblogs.com/WABoss/p/5184223.html
Copyright © 2011-2022 走看看