如果有两种颜色的珠子个数是奇数个,那么魅力值就是0,任意输出一个串就可以。
否则,魅力值一定是颜色个数的最大公约数。
代码如下:
#include<bits/stdc++.h> #define lalala printf("lalala\n"); #define N 35 using namespace std; int n,cnt[N]; int c[N]; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>cnt[i]; int num=cnt[1]; int flag=0; for(int i=1;i<=n;i++) { if(cnt[i]&1) { flag++; if(flag==2) break; } } for(int i=2;i<=n;i++) num=__gcd(num,cnt[i]); if(flag==2) { printf("0\n"); for(int i=1;i<=n;i++){ if(cnt[i]) { while(cnt[i]--) printf("%c",i+'a'-1); } } printf("\n"); return 0; } for(int i=1;i<=n;i++) cnt[i]/=num; /* for(int i=1;i<=n;i++) printf("%d ",cnt[i]); printf("\n"); */ printf("%d\n",num); flag=0; for(int i=1;i<=n;i++){ if(cnt[i]%2==1){ flag++; if(flag==2) break; } } if(flag==2) { num/=2; while(num--) { memcpy(c,cnt,sizeof(cnt)); for(int i=1;i<=n;i++) { while(c[i]) { printf("%c",'a'+i-1); c[i]--; } } memcpy(c,cnt,sizeof(cnt)); for(int i=n;i>=1;i--) { while(c[i]){ printf("%c",'a'+i-1); c[i]--; } } } cout<<endl; } else { //lalala while(num--) { memcpy(c,cnt,sizeof(cnt)); for(int i=1;i<=n;i++) { if(c[i]%2==0) { c[i]/=2; while(c[i]){ printf("%c",'a'+i-1); c[i]--; } } } for(int i=1;i<=n;i++){ if(c[i]%2) { while(c[i]){ printf("%c",'a'+i-1); c[i]--; } } } memcpy(c,cnt,sizeof(c)); for(int i=n;i>=1;i--) { if(c[i]%2==0) { c[i]/=2; while(c[i]){ printf("%c",'a'+i-1); c[i]--; } } } } printf("\n"); } return 0; }