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