题目链接:https://ac.nowcoder.com/acm/contest/5675/A
思路:
对于 i 位置若 a[i-1]* 2%p没有使用过就使用,否则就使用 a[i-1]* 3%p,若两个都已被使用,说明必定有冲突。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
bool vis[maxn];
int a[maxn];
int main()
{
int t, p;
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
memset(vis, 0, sizeof(vis));
a[1] = 1;
vis[1] = 1;
bool flag = 0;
for(int i = 2; i < p; i++) {
int a2 = a[i-1]*2%p, a3 = a[i-1]*3%p;
if(!vis[a2]) {
vis[a2] = 1;
a[i] = a2;
}
else if(!vis[a3])
{
vis[a3] = 1;
a[i] = a3;
}
else {
flag = 1;
break;
}
}
if(flag) printf("-1");
else
{
for(int i = 1; i < p; i++) {
printf("%d ",a[i]);
}
}
printf("\n");
}
}
京公网安备 11010502036488号