#include <iostream>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int n, l, len, ct;
char str[85];
bool flag;
bool checkSubStr() { // easy string if false,else true
for (int i = 2; i <= len; i += 2) {
int k = i >> 1;
bool flag = false;
for (int j = len - 1; j > len - 1 - k; --j) {
if (str[j] != str[j - k]) {
flag = true;
break;
}
}
if (!flag) {
return false;
}
}
return true;
}
void dfs() {
if (ct == n) {
flag = true;
return;
}
for (int i = 0; i < l; ++i) {
char ch = 'A' + i;
str[len++] = ch;
if (checkSubStr()) {
ct++;
//printf("%d: %s\n",ct, str);
dfs();
if (flag) {
return;
}
//ct--;
}
len--;
}
}
int main() {
while (~scanf("%d%d", &n, &l)) {
if (n == 0 && l == 0) {
break;
}
flag = false;
ct = len = 0;
dfs();
int c = 0;
for (int i = 0; i < len; ++i) {
putchar(str[i]);
c++;
if (c % 4 == 0 && i != len - 1) {
if (c % 64 == 0) {
putchar('\n');
}
else {
putchar(' ');
}
}
}
printf("\n%d\n", len);
}
return 0;
}
PE到爆炸,回溯法不难想到,而且如果有l >= 3,基本不需要回溯了。注意格式输入即可,空格只存在与两组字符之间,最后一组不需要空格。