题意:找到一个m位n进制整数,乘以2、3、4...m之后,所得到的数恰好是原数字各数字的一个排列。
题解:先枚举出这个数字的个位数,然后乘2、3、4...m后得到剩下的数字,然后全排列,如果有满足条件的就输出。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 7;
int n, m, num[N], arr[N], vis[N];
bool judge(int x) {
for (int i = 2; i <= m; i++)
arr[i] = i;
do {
int flag2 = 1;
for (int i = 2; i <= m; i++) {
memset(vis, 0, sizeof(vis));
vis[i] = 1;
int temp = (x * i) / n;
for (int j = 2; j <= m; j++) {
int temp2 = (num[arr[j]] * i + temp) % n;
temp = (num[arr[j]] * i + temp) / n;
int flag = 0;
for (int k = 1; k <= m; k++) {
if (temp2 == num[k] && !vis[k]) {
vis[k] = 1;
flag = 1;
break;
}
}
if (!flag) {
flag2 = 0;
break;
}
}
if (!flag2)
break;
}
if (flag2)
return true;
}while (next_permutation(arr + 2, arr + m + 1));
return false;
}
int main() {
while (scanf("%d%d", &m, &n) && m + n) {
int flag = 0;
for (int i = 1; i < n; i++) {
for (int j = 1; j <= m; j++)
num[j] = (i * j) % n;
if (judge(i)) {
flag = 1;
for (int k = m; k >= 2; k--)
printf("%d ", num[arr[k]]);
printf("%d\n", i);
}
}
if (!flag)
printf("Not found.\n");
}
return 0;
}