hdu 2588(欧拉函数)

题意:容易理解.

分析:假设x<=n,n=p*d,x=q*d.假设n与x的最大公约数为d,则能够推出p与q肯定是互质的,因为x<=n所以要求的就是p的欧拉函数值了,那么我们就转化成求满足:n=p*d,并且d>=m的p的欧拉函数值之和了。

代码实现:

#include<stdio.h>
#include<string.h>
int haha(int n)//求n的欧拉函数值
{
    int res=n,i,j;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            n=n/i;
            while(n%i==0)
                n=n/i;
            res=res/i*(i-1);
        }
        if(n<(i+1))
            break;
    }
    if(n>1)
        res=res/n*(n-1);
    return res;
}
int main()
{
    int T,n,m,i,sum;
    while(scanf("%d",&T)!=EOF)
    {
        while(T--)
        {
          sum=0;
          scanf("%d%d",&n,&m); 
          for(i=1;i*i<=n;i++)
              if(n%i==0)
              {
                  if(i>=m)
                      sum=sum+haha(n/i);
                  if((n/i)!=i&&(n/i)>=m)
                      sum=sum+haha(i);
              }
          printf("%d\n",sum);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jiangjing/p/3101861.html