2020牛客暑期多校训练营(第十场)
A Permutation
题目大意:
给你一个质数\(p\),请你寻找一个排列包含\(1,2,...p-1\),满足\(x_{i+1}\equiv 2x_{i}\left ( mod \ p \right )\)或者\(x_{i+1}\equiv 3x_{i}\left ( mod \ p \right )\)
题目分析:
直接进行模拟,若第i项满足\(x_{i+1}\equiv 2x_{i}\left ( mod \ p \right )\),则我们使用它,否则考虑\(x_{i+1}\equiv 3x_{i}\left ( mod \ p \right )\),若两者都被使用,则说明不存在排列。
代码
#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));//将vis数组全部重置为0
a[1] = 1;
vis[1] = 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;//通过第i-1项,计算出第i项可能的结果。
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");
}
return 0;
}
E Game
题目大意:
给你一个质数\(p\),请你寻找一个排列包含\(1,2,...p-1\),满足\(x_{i+1}\equiv 2x_{i}\left ( mod \ p \right )\)或者\(x_{i+1}\equiv 3x_{i}\left ( mod \ p \right )\)
题目分析:
直接进行模拟,若第i项满足\(x_{i+1}\equiv 2x_{i}\left ( mod \ p \right )\),则我们使用它,否则考虑\(x_{i+1}\equiv 3x_{i}\left ( mod \ p \right )\),若两者都被使用,则说明不存在排列。