标签:
1.17
CF 614 E Necklace
类似于函数图像有两条对称轴 必然是周期的。
如果循环次数是奇数 每一循环节都要是回文 把奇数的放中间 偶数放两边 (所以奇数的不止1个就无解)。
循环次数偶 随便放一个循环节 相邻的对称一下即可。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int maxn = 1e5 + 10; 5 int num[26]; 6 char s[maxn]; 7 8 int gcd(int a, int b) 9 { 10 return a % b ? gcd(b, a % b) : b; 11 } 12 13 int main(void) 14 { 15 int n, cnt = 0; 16 scanf("%d", &n); 17 for(int i = 0; i < n; i++) scanf("%d", num + i); 18 int tmp = num[0]; 19 for(int i = 1; i < n; i++) tmp = gcd(tmp, num[i]); 20 for(int i = 0; i < n; i++) num[i] /= tmp; 21 if(tmp & 1) 22 { 23 int pos1 = -1; 24 for(int i = 0; i < n; i++) 25 { 26 if(num[i] & 1) 27 { 28 if(pos1 == -1) pos1 = i; 29 else 30 { 31 puts("0"); 32 for(int k = 0; k < n; k++) 33 for(int j = 0; j < tmp * num[k]; j++) 34 putchar(‘a‘ + k); 35 puts(""); 36 return 0; 37 } 38 } 39 } 40 for(int i = 0; i < n; i++) 41 { 42 if(num[i] & 1) num[i]--; 43 for(int j = 0; j < num[i] / 2; j++) 44 s[cnt++] = ‘a‘ + i; 45 } 46 int l = cnt; 47 if(pos1 != -1) s[cnt++] = ‘a‘ + pos1; 48 for(int j = 1; j <= l; j++) s[cnt++] = s[l-j]; 49 s[cnt] = 0; 50 printf("%d\n", tmp); 51 for(int j = 0; j < tmp; j++) printf("%s", s); 52 puts(""); 53 } 54 else 55 { 56 for(int i = 0; i < n; i++) 57 for(int j = 0; j < num[i]; j++) 58 s[cnt++] = ‘a‘ + i; 59 for(int i = cnt; i; i--) 60 s[cnt++] = s[i-1]; 61 s[cnt] = 0; 62 printf("%d\n", tmp); 63 for(int j = 0; j < tmp / 2; j++) printf("%s", s); 64 puts(""); 65 } 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/Aguin/p/5136656.html