欧拉函数 51Nod - 1136
考察:欧拉函数
orz...AcWing的例题再做一次不会做了..满脑子线性筛开不了那么大的数组.到把原公式忘了....
其实不用筛质数.直接分解质因数即可
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 const int N = 1e5+10; 5 int phi[N],cnt,prime[N]; 6 bool st[N]; 7 void Get_er(int n) 8 { 9 phi[1] = 1; 10 for(int i=2;i<=n;i++) 11 { 12 if(!st[i]) prime[cnt++] = i,phi[i] = i-1; 13 for(int j=0;prime[j]<=n/i;j++) 14 { 15 st[i*prime[j]] = 1; 16 if(i%prime[j]==0) 17 { 18 phi[i*prime[j]] = phi[i]*prime[j]; 19 break; 20 } 21 phi[i*prime[j]] = phi[i]*(prime[j]-1); 22 } 23 } 24 } 25 int main() 26 { 27 int n; 28 scanf("%d",&n); 29 long long ans = n; 30 vector<int> res; 31 Get_er(100000); 32 for(int i=0;prime[i]<=n/prime[i];i++) 33 { 34 if(n%prime[i]==0) 35 { 36 while(n%prime[i]==0) n/=prime[i]; 37 res.push_back(prime[i]); 38 } 39 } 40 if(n>1) res.push_back(n); 41 for(auto it:res) 42 ans = ans/it*(it-1); 43 printf("%lld",ans); 44 return 0; 45 }