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 }
View Code

 

 
 
posted @ 2018-08-25 08:35  kasiruto  阅读(65)  评论(0编辑  收藏