欧拉函数

学习资料:https://blog.csdn.net/sentimental_dog/article/details/52002608

 

 

注意最后一行需要让res/a*(a-1)

因为a本身是可以模a的,但i*i<=a,所以没有枚举到a本身

int euler(int n)
{
    int res=n,a=n;
    for(int i=2;i*i<=a;i++)
    {
        if(a%i==0)
        {
            res=res/i*(i-1);
            while(a%i==0)
              a/=i;
        }
    }
    if(a>1)res=res/a*(a-1);
    return res;
}

  

例题一:http://codeforces.com/gym/101778/problem/C

解:    直接套用欧拉函数即可

例题二:http://acm.hdu.edu.cn/showproblem.php?pid=2588

 解: 将x与n转化为,x=a*b,n=a*d(b和d互质,并且d大于等于b)对于每个大于等于m的a  ,这样的b有euler(d)个。

#include <bits/stdc++.h>
using namespace std;
int euler(int n)
{
    int res=n,a=n;
    for(int i=2;i*i<=a;i++)
    {
        if(a%i==0)
        {
            res=res/i*(i-1);
            while(a%i==0)
              a/=i;
        }
    }
    if(a>1)res=res/a*(a-1);
    return res;
}
int main()
{
    int t,n,m;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
         int ans=0;
         scanf("%d %d",&n,&m);
         for(int j=1;j*j<=n;j++)
         {
             if(n%j==0)
             {
                 if(j>=m)ans+=euler(n/j);
                 if(n/j>=m&&j*j!=n)ans+=euler(j);
             }
         }
         printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2018-04-24 08:54  czh~  阅读(139)  评论(0编辑  收藏  举报