题目链接:http://codeforces.com/problemset/problem/1174/C
题意:给你一个n,要你填充 下标由2 ~ n 的数组ai,要求下标互质的俩个数不能相等,并且数组中最大值最小化。
思路:打个素数表,每个质数肯定互质所以我们令第一个质数为1,第二个质数为2...依次类推,然后根据 算术基本定理 ,合数就让它等于第一个分解的质数啦。
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 }