A-Permutation

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

相关推荐

06-25 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务