题目链接: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"); } }