トピックへのリンク:http://codeforces.com/problemset/problem/1174/C
問題の意味:Nあなたは、あなたが2〜の配列の添字nを記入しなければならないA Iを、添字請求素数は2に等しいではなく、配列の最大値が最小化されます。
アイデア:、素数の各首相はそう、我々は最初の素数が第二の素数は、その後によると、2のように...そして、1であることを確認して素数のリストを作成算術の基本定理、最初に等しく、その上に合成数友人の素数分解。
ACコード:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN= 2e5 +5; 4 int vis[MAXN]; 5 int a[MAXN]; 6 int n; 7 void init() 8 { 9 vis[0] = 1; 10 vis[1] = 1; 11 for(int i = 2;i < MAXN;i ++) 12 { 13 if(! vis[i]) 14 { 15 vis[i] = 0; 16 for(int j = 2*i;j <= MAXN; j += i) 17 { 18 vis[j] = 1; 19 } 20 } 21 } 22 } 23 int gcd(int a,int b) 24 { 25 if(b == 0) 26 return a; 27 else return gcd(b,a%b); 28 } 29 int main() 30 { 31 int n; 32 scanf("%d",&n); 33 memset(vis,0,sizeof(vis)); 34 init(); 35 int cnt = 1; 36 for(int i = 2;i <= n;i++) 37 { 38 if(!vis[i]) a[i] = cnt++; 39 else 40 { 41 for(int j = 2;j <= i;j++) 42 { 43 if(gcd(i,j) != 1) 44 { 45 a[i] = a[j]; 46 break; 47 } 48 } 49 } 50 } 51 for(int i = 2;i <= n;i++) 52 { 53 printf("%d ",a[i]); 54 } 55 return 0; 56 }