LightOJ 1370 Bi-shoe and Phi-shoe
1 /* 2 LightOJ 1370 Bi-shoe and Phi-shoe 3 http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1370 4 数论 欧拉函数 5 坑点是答案会爆int!!!! 6 */ 7 #include <cstdio> 8 #include <algorithm> 9 #include <cstring> 10 #include <cmath> 11 #include <vector> 12 #include <queue> 13 #include <iostream> 14 #include <map> 15 #include <set> 16 //#define test 17 using namespace std; 18 const int Nmax=1e6+5e5;//Nmax一定要大于1e6否则会找不到答案 19 int phi[Nmax]; 20 int prime[Nmax]; 21 int is_prime[Nmax]; 22 int prime_cnt; 23 void get() 24 { 25 phi[1]=1; 26 for(int i=2;i<Nmax;i++) 27 is_prime[i]=1; 28 for(long long i=2;i<Nmax;i++) 29 { 30 if(is_prime[i]) 31 { 32 prime[++prime_cnt]=i; 33 phi[i]=i-1; 34 } 35 for(int j=1;j<=prime_cnt;j++) 36 { 37 if(i*prime[j]>=Nmax) 38 break; 39 is_prime[i*prime[j]]=0; 40 if(i%prime[j]==0) 41 { 42 phi[i*prime[j]]=phi[i]*prime[j]; 43 break; 44 } 45 else 46 phi[i*prime[j]]=phi[i]*(prime[j]-1); 47 } 48 } 49 } 50 int main() 51 { 52 #ifdef test 53 #endif 54 get(); 55 phi[1]=0;//此题要求phi[1]=0; 56 //for(int i=1;i<Nmax;i++) 57 //{ 58 //num[i].id=i; 59 //num[i].val=phi[i]; 60 //} 61 //sort(num+1,num+Nmax); 62 //for(int i=1;i<=40;i++) 63 //{ 64 //printf("phi[%d]:%d\n",i,phi[i]); 65 //} 66 int t,n; 67 scanf("%d",&t); 68 for(int ttt=1;ttt<=t;ttt++) 69 { 70 scanf("%d",&n); 71 long long ans=0LL;//此题一大坑点,ans会爆int 72 int a; 73 for(int i=1;i<=n;i++) 74 { 75 scanf("%d",&a); 76 for(int j=a+1;j<Nmax;j++)//强力减枝! 77 { 78 if(phi[j]>=a) 79 { 80 ans+=1LL*j; 81 break; 82 } 83 } 84 } 85 printf("Case %d: %lld Xukha\n",ttt,ans); 86 } 87 return 0; 88 }