1 /** 2 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b); 3 思路: 快速求欧拉函数 4 **/ 5 6 #include <iostream> 7 #include <cstring> 8 using namespace std; 9 #define Max 3000000 10 11 long long phi[Max+5]; 12 int prime[Max/10]; 13 bool flag[Max+5]; 14 15 void init() 16 { 17 int i,j,num=0; 18 memset(flag,1,sizeof(flag)); 19 phi[1]=1; 20 for(i=2;i<=Max;i++)//欧拉筛选 21 { 22 if(flag[i]) 23 { 24 prime[num++]=i; 25 phi[i]=i-1; 26 } 27 for(j=0;j<num && prime[j]*i<=Max;j++) 28 { 29 flag[i*prime[j]]=false; 30 if(i%prime[j]==0) 31 { 32 phi[i*prime[j]]=phi[i]*prime[j]; 33 break; 34 } 35 else phi[i*prime[j]]=phi[i]*(prime[j]-1); 36 } 37 } 38 for(i=2;i<=Max;i++) 39 phi[i] = phi[i-1]+phi[i]; 40 } 41 42 int main(){ 43 init(); 44 long long a,b; 45 while(cin>>a>>b){ 46 long long res = phi[b]-phi[a-1]; 47 cout<<res<<endl; 48 } 49 }