题意:给出一个指数p,问1~p-1的数是否存在这样一个序列:a[i+1]=(a[i]*2)%p,或者a[i+1]=(a[i]*3)%p,如果存在打印这个序列,否则输出-1;
这题真的是实力眼瞎,没注意到不存在输出-1,然后做到自闭。这应该是道签到题,做法很简单,直接dfs暴力遍历就可以了,我看其他人的做法,发现有的人是没有回溯,如果两种不符合就是不存在,但是没有回溯判断前面的数如果从第一种情况转为第二种情况是否存在,本蒟蒻数学不太好,不知道是啥原理…所以只能讲暴力dfs了
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
int arr[N];
int vis[N];
int mod;
int dfs(int now, int cnt) {
if (cnt == mod - 1) return 1;
int sign = (2 * now) % mod;
if (!vis[sign] ) {
arr[cnt + 1] =sign;
vis[sign] = 1;
int ret = dfs(sign, cnt + 1);
if (ret) return ret;
vis[sign] = 0;
}
sign = (3 * now) % mod;
if (!vis[sign] ) {
arr[cnt + 1] = sign;
vis[sign] = 1;
int ret = dfs(sign, cnt + 1);
if (ret) return ret;
vis[sign] = 0;
}
return 0;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, sign = -1;
scanf("%d", &mod);
for(int k=0;k<=mod;k++) vis[k]=0;
vis[1] = 1;
arr[1] = 1;
sign = dfs(1, 1);
if(sign==0){
printf("-1\n");
continue;
}
for (int i = 1; i < mod; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
}