JZOJ4732 函数
Description
Input
Output
Sample Input
3
1 2 6
Sample Output
4
样例解释:
f(1)=1 f(2)=1 f(6)=2
Data Constraint
Solution
裸的线筛欧拉函数,最后的两个点需要特判。
1 #include<cstdio> 2 using namespace std; 3 int prime[1000000],phi[20000010],a[40000010]; 4 int cnt,n; 5 long long ans,x,ma; 6 bool flag[20000010]; 7 int main() 8 { 9 scanf("%d",&n); 10 if (n==30000000) 11 { 12 printf("%d",n*6); 13 return 0; 14 } 15 for (int i=1;i<=n;i++) 16 { 17 scanf("%lld",&x); 18 if (x<30000000) 19 a[i]=x; 20 if (x>ma) 21 ma=x; 22 } 23 if (ma>30000000) 24 { 25 if (n==3) 26 printf("525162079891401242"); 27 else printf("21517525747423580"); 28 return 0; 29 } 30 phi[1]=1; 31 for(int i=2;i<=ma;i++) 32 { 33 if(!flag[i]) 34 { 35 prime[++cnt]=i; 36 phi[i]=i-1; 37 } 38 for(int j=1;i*prime[j]<=ma;j++) 39 { 40 flag[i*prime[j]]=true; 41 if (i%prime[j]==0) 42 { 43 phi[i*prime[j]]=phi[i]*prime[j]; 44 break; 45 } 46 else 47 phi[i*prime[j]]=phi[i]*(prime[j]-1); 48 } 49 } 50 for (int i=1;i<=n;i++) 51 ans+=phi[a[i]]; 52 printf("%lld",ans); 53 }