Bi-shoe and Phi-shoe LightOJ - 1370
考察:质数筛+欧拉函数
正确思路:
列出下标从小到大列出欧拉函数的值,可以发现合数的欧拉函数值在前面一定有个比它小的质数取值与它相同.比如phi[4]=2,而在它前面phi[3]已经可以取值2.根据这条性质可以AC此题
易错:
不能只筛到1e6的质数.如果a[i]刚好取值1e6.那么就取不到比它大的素数的值
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 typedef long long ll; 5 const int N = 1e6+10; 6 int prime[N],cnt,phi[N]; 7 bool st[N]; 8 void Get_euler(int n) 9 { 10 phi[1] = 1; 11 for(int i=2;i<=n;i++) 12 { 13 if(!st[i]) prime[cnt++] = i,phi[i] = i-1; 14 for(int j=0;prime[j]<=n/i;j++){ 15 st[i*prime[j]] = 1; 16 if(i%prime[j]==0) 17 { 18 phi[i*prime[j]] = phi[i]*prime[j]; 19 break; 20 } 21 phi[i*prime[j]] = phi[i]*(prime[j]-1); 22 } 23 } 24 } 25 int main() 26 { 27 int T,kcase = 0; 28 scanf("%d",&T); 29 Get_euler(1e6+5); 30 while(T--) 31 { 32 int n; 33 ll res = 0; 34 scanf("%d",&n); 35 while(n--) 36 { 37 int x; scanf("%d",&x); 38 int idx = upper_bound(prime,prime+cnt,x)-prime; 39 res+=prime[idx]; 40 } 41 printf("Case %d: %lld Xukha\n",++kcase,res); 42 } 43 return 0; 44 }