【模拟】阿里郎(arilang)
发布日期:2021-05-07 22:49:36 浏览次数:22 分类:精选文章

本文共 1503 字,大约阅读时间需要 5 分钟。

阿里郎是朝鲜一年一度的壮丽演出,有100000 名演员参与。现在你将协助他们,你所负责的是其中n 名演员的服装。

n 名演员,将按n的所有约数d进行分组, {n的所有约数,数学表示(d | n),}每组有n /d 人。,同一组中的演员们将会手拉手围成一个环。第一个环中是1; d + 1; 2d + 1; 3d + 1; : : : ; n-d + 1。第二个环中是2; d+2; 2d+2; 3d+2; : : : ; n-?d+2。依次类推。第d 个环中是d; 2d; : : : ; n。
现在你要为他们分配服装。为了展现人民的力量,每个环中相邻的人衣服颜色都不能相同。你已经知道了n 的值,但当你问及d 时,你被告知“你想知道的太多了,如果不能完成的话,******************”。衣服只有26 种不同颜色。你能对任何d 值完成任务吗?#

Input

一行,一个整数n。

Output

若有解,输出一行n 个字符。第i 个字符表示第i 号演员衣服的颜色,用小写英文字母表示。若有多种方案,请输出字典序最小的方案。

若无解,你得给家属留些话,输出"Impossible" 。

Sample Input

7

Sample Output

abababc


据说题意是最难懂的。。。我看懂了题意,就是没敲。。。

其实数据还是模拟地起的。先一个一个点搜过去,枚举字符,看看可不可以填(枚举每一个约数,然后看看跟它相邻的数的字符相不相同),不可以就枚举下一个字符,可以就记录下来算下一个数。

#include
int n,a[300001],t;bool tt;char maxx='a',z[300001];void dfs(int k){ while(k<=n){ for(int i='a';i<='z';++i){ //枚举字符 tt=0; for(int j=1;j<=t;++j){ //枚举约数 int k1=k-a[j],k2=k+a[j]; //与它相邻的俩个位置 if(k1<1) k1+=n; if(k2>n) k2-=n; if(z[k1]==i||z[k2]==i){ //判断 tt=1; break; } } if(tt==0){ //如果可以 z[k]=i; break; } } if(tt==0) ++k; //可以 else{ //不行的话直接输出 printf("Impossible"); return; } }}int main(){ freopen("arilang.in","r",stdin); freopen("arilang.out","w",stdout); scanf("%d",&n); for(int i=1;i*i<=n;++i) //寻找约数 if(n%i==0){ a[++t]=i; a[++t]=n/i; if(n/i==i||i==1) --t; } dfs(1); if(tt==0) //如果有解 for(int i=1;i<=n;++i) printf("%c",z[i]); else printf("Impossible"); fclose(stdin); fclose(stdout);}
上一篇:【高精压位】【递推】逆序对
下一篇:【最小生成树prim】给水

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月22日 01时32分30秒