学习资料: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 ",ans); } return 0; }