欧拉函数

模板

 1 #include<stdio.h>
 2 const int MAXN=3000010;
 3 bool  vis[MAXN];
 4 int prime[MAXN/10];
 5 long long euler[MAXN];
 6 int main()
 7 {
 8     int i,j,temp,top;
 9     int  n;
10     top=0;
11     euler[1]=1;
12     for (i=2; i<MAXN; i++)
13     {
14         if (!vis[i])
15         {
16             prime[top++]=i;
17             euler[i]=i-1;///质数p的欧拉函数=p-1
18         }
19         for(j=0;prime[j]*i<MAXN;j++)
20         {
21             vis[prime[j]*i]=1;
22             if(i%prime[j]==0)///遇到最小素因数退出循环
23             {
24                 ///因为i去除过prime[j]的倍数,所以不需要再次去除
25                 euler[i*prime[j]]=euler[i]*prime[j];
26                  break;
27             }
28             else
29             {
30                 ///因为i不含有prime[j],需要去除prime[j]的倍数
31                 ///因为i与prime[j]互质
32                 ///=> euler[i*prime[j]]=euler[i]*euler[prime[j]];
33                 euler[i*prime[j]]=euler[i]*(prime[j]-1);
34             }
35         }
36     }
37     for(i=2;i<MAXN;i++)
38     {
39         euler[i]+=euler[i-1];///对欧拉函数求前缀和
40     }
41     int a,b;
42     while(scanf("%d%d",&a,&b)!=EOF)
43     {
44         printf("%I64d
", euler[b]- euler[a-1]);
45     }
46     return 0;
47 }
原文地址:https://www.cnblogs.com/yZiii/p/7285872.html