码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2588 GCD

时间:2014-08-27 21:52:28      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:style   io   for   amp   sp   on   size   c   return   

题目大意:给定N,M, 求1<=X<=N 且gcd(X,N)>=M的个数。

题解:首先,我们求出数字N的约数,保存在约数表中,然后,对于大于等于M的约数p[i],求出Euler(n/p[i]),累计就是答案。因为对于每一个大于等于m的约数,GCD(N,t*p[i])=p[i]>=m(t与p[i]互质),所以n除以p[i]的欧拉函数的和就是答案。

#include <cstdio>
int T,cnt,p[10000],n,m,i;
int Euler(int n){
    int ret=1;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            n/=i,ret*=i-1;
            while(n%i==0)n/=i,ret*=i;
        }
    }
    if(n>1)ret*=(n-1);
    return ret;
}
int main(){
    scanf("%d",&T);
    while(T--){
        int ans=cnt=0; 
        scanf("%d%d",&n,&m);
        for(i=1;i*i<n;i++)if(n%i==0)p[cnt++]=i,p[cnt++]=n/i;
        if(n%i==0)p[cnt++]=i;
        for(int i=0;i<cnt;i++)if(p[i]>=m)ans+=Euler(n/p[i]);
        printf("%d\n",ans);
    }return 0;
}

HDU 2588 GCD

标签:style   io   for   amp   sp   on   size   c   return   

原文地址:http://www.cnblogs.com/forever97/p/3940380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!