BestCoder#51
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 using namespace std; 6 bool visit[10100000]; 7 int prime[10000000]; 8 9 10 void init_prim() 11 { 12 memset(visit, true, sizeof(visit)); 13 int num = 0; 14 for (int i = 2; i <= 10000000; ++i) 15 { 16 if (visit[i] == true) 17 { 18 num++; 19 prime[num] = i; 20 } 21 for (int j = 1; ((j <= num) && (i * prime[j] <= 10000000)); ++j) 22 { 23 visit[i * prime[j]] = false; 24 if (i % prime[j] == 0) break; 25 } 26 } 27 } 28 int main() { 29 memset(prime, 0, sizeof(prime)); 30 int T, n; 31 init_prim(); 32 scanf("%d", &T); 33 while(T--) { 34 scanf("%d", &n); 35 bool flag = true; 36 if(n < 1e6) { 37 if(n == 4) { 38 printf("%d\n", 2); 39 } else if(visit[n] == true){ 40 printf("%d\n", n-1); 41 } else { 42 printf("%d\n", 0); 43 } 44 } else { 45 for(int i = 1; prime[i] <= sqrt(n); ++i) { 46 if(n % prime[i] == 0) { 47 flag = false; 48 printf("%d\n", 0); 49 break; 50 } 51 } 52 if(flag) { 53 printf("%d\n", n-1); 54 } 55 } 56 } 57 return 0; 58 }