欧拉函数 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 } 

 

posted @ 2021-01-17 11:42  acmloser  阅读(98)  评论(0编辑  收藏  举报