https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3703
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int cas, n, l[5], c[26];
char c1[6][6], c2[6][6], c3[6][6];
scanf("%d\n", &cas);
while (cas--){
scanf("%d\n", &n);
for (int i = 0; i<6; i++)
gets(c1[i]);
for (int i = 0; i<6; i++)
gets(c2[i]);
fill(l, l + 5, 0);
for (int i = 0; i<5; i++){
char temp[12];
int k = 0;
fill(c, c + 26, 0);
for (int j = 0; j<6; j++){
for (int j1 = 0; j1<6; j1++){
if (c1[j][i] == c2[j1][i] && c[(int)(c1[j][i] - 'A')] == 0)
c3[i][k] = c1[j][i], k++, l[i]++, c2[j1][i] = 1, c[(int)(c1[j][i] - 'A')] = 1;
}
}
sort(c3[i], c3[i] + k);
}
if (n>l[0] * l[1] * l[2] * l[3] * l[4])
printf("NO\n");
else {
for (int i = 0; i<5; i++){
int temp = 1;
for (int j = i + 1; j<5; j++)
temp*= l[j];
l[i] = (i != 4?(n-1) / temp:(n - 1) % l[i]);
n-= l[i] * temp;
}
for (int i = 0; i<5; i++)
printf("%c", c3[i][l[i]]);
printf("\n");
}
}
return 0;
}