2020牛客多校第十场 A-Permutation

Permutation

  • 题意
  • 思路
  • 代码

链接

题意

给定一个数p,找到一个长度为p-1的排列,假设排列为{x1,x2,……,xp-2}使得对于所有的 i ( 1 ≤ i ≤ p − 2 ) , x i + 1 ≡ 2 x i i(1\leq i \leq p-2),x_{i+1}\equiv 2x_{i} i(1ip2),xi+12xi(mod p)或者 x i + 1 ≡ 3 x i x_{i+1}\equiv 3x_{i} xi+13xi(mod p)。
比如p=5时
答案是{1,2,4,3}
2=12(mod 5)
4=2
2(mod 5)
3=4*2(mod 5)

思路

经过打表可见,先选择2的倍数,不行的话选择3的倍数,再不行就是-1.
写的时候忘记了把vis[1]设为1,痛失一道签到题。
如果简单题过不了就让队友再写一遍吧。

代码

#include
using namespace std;
const int N=1e6+10;
int ans[1000010],vis[1000010],p;
int main(){
// freopen(“5.out”,“wb”,stdout);
int t;
scanf("%d",&t);
while(t–){
bool f=0;
scanf("%d",&p);
memset(vis,0,sizeof(vis));
int tmp=1;
vis[1]=1;
for(int i=1;i<=p-1;i++){
ans[i]=tmp;
if(i==p-1)break;
if(!vis[tmp2%p]){
tmp=tmp
2%p;
vis[tmp]=1;
}else if(!vis[tmp3%p]){
tmp=tmp
3%p;
vis[tmp]=1;
}else {
f=1;
break;
}
}
if(f){
printf("-1");
}else {
for(int i=1;i<=p-1;i++){
printf("%d “,ans[i]);
}
}
puts(”");
}
return 0;
}
/*
7
17
23
31
41
43
47
71
73
79
*/

你可能感兴趣的:(牛客多校)