/*困难串(无两个相邻的重复字串)*/ #include <iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define maxn 1000 int cnt,n,L; int S[maxn]; int dfs(int cur)//返回0表示已经得到解,无须继续搜索 { int i,ok,j,k,equals; if(cnt++==n)//输出方案 { for(i=0; i<cur; i++) printf("%c",'A'+S[i]); printf(" "); return 0; } for(i=0; i<L; i++) { S[cur]=i; ok=1; for(j=1; 2*j<=cur+1; j++) //尝试长度为j*2的后缀 { equals=1; for(k=0; k<j; k++) if(S[cur-k]!=S[cur-k-j])//检查后一半是否等于前一半 { equals=0; break; } if(equals)//递归搜索,如果找到解,则直接退出 { ok=0; break; } } if(ok) if(!dfs(cur+1)) return 0; } return 1; } int main() { while(~scanf("%d%d",&n,&L)) { cnt=0; dfs(0); } return 0; } /*输出由前L个字符组成的,字典序第n小的困难的串*/