您的位置:首页 > 其它

Levko and Permutation CodeForces - 361B 思维 数论

2017-12-13 17:17 411 查看

题意

对一个长度,最大值为n的排列 构造出其恰好有k个GCD(i,a[i])>1 的排列
n<=1e5;


分析

由于每个大于1的数与自己的gcd必然>1
所以构造大于1的gcd可以用i与i去构造
那么还有就是相邻的两个数的gcd必然等于1
任何数与1的gcd都等于1
所以让k个数 从2开始使得a[i] = i 并且后面的数填比自己下标大1的数
多的从前面补上 当k+1<=n的情况都有解


code

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
int n,k;
ios::sync_with_stdio(0);
scanf("%d%d",&n,&k);
if(k>=n)puts("-1");
else{
if(k!=n-1){
int c,i,tag = 2;
for(c=1,i = 2;c<=k;c++,i++){
a[i]=i;
}
c=i;
for(;i<=n;i++){
a[i] = (i+1==n?n:(i+1)%n);  //如果下表为n 注意填n不是0
}
a[1]=c;
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
}
else{
for(int i=1;i<=n;i++)
printf("%d%c",i,i==n?'\n':' ');
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcd