模板
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 }