Description
给定 n n n 和 k k k,求一个 n n n 的排列 p 1 , p 2 … p n p_1,p_2\dots p_n p1,p2…pn,使得有恰好有 k k k 个 i i i,满足 gcd ( i , p i ) = 1 \gcd(i,p_i)=1 gcd(i,pi)=1。
Solution
前置芝士:最大公约数 - OI Wiki (oi-wiki.org)
我们知道: gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb)
因此当 a = b + 1 a=b+1 a=b+1 时, gcd ( a , b ) = gcd ( b , a m o d b ) = gcd ( b , 1 ) = 1 \gcd(a,b)=\gcd(b,a\bmod b)=\gcd(b,1)=1 gcd(a,b)=gcd(b,amodb)=gcd(b,1)=1。
所以对于任意一对相邻的数,它们的最大公约数为 1 1 1。
那我们在 i ∈ [ 1 , k − 1 ] i\in [1,k-1] i∈[1,k−1] 的位置上放 i + 1 i+1 i+1,在 k k k 的位置放 1 1 1,在 i ∈ [ k + 1 , n ] i\in[k+1,n] i∈[k+1,n] 的位置上放 i i i,就能满足条件。
对于
k
=
0
k=0
k=0 的特殊情况,我们输出 -1
即可。
Code
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
if(k==0) cout<<-1<<endl;
else {
for(int i=1;i<=k;i++){
cout<<i%k+1<<" ";
}
for(int i=k+1;i<=n;i++){
cout<<i<<" ";
}
}
return 0;
}