P9345 题解(2023 激励计划评分 6)
有一定思维含量的思维题(蒟蒻想了 分钟)。
至少这个难度评的比较正确。
思路
显然的在前 个数中理论上最大的公约数只会是 ,因此 的理论上界即为 。
考虑对于 的情况。
显然 ,考虑对于前 个数,将其分成 的形式。
然而,这样的序列会有重复,例如:
考虑将 拼成一组,即 ,其中 为奇数或 。
然而这样可能会超 的限制,怎么办呢?
考虑 序列,在上面这种情况下一定出现 。
而前 个数可以产生 个最大公约数,因此,我们把 区间内的数全部倒序排列在 的后面,即 。
因为 一定为奇数,不会和 产生最大公约数。
所以这道题就解完了,代码如下。
#include<bits/stdc++.h>
using namespace std;
int T,n,k,a[300005];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
if(k>n/2){
printf("No\n");
continue;
}
cout<<"Yes\n1 ";
for(int i=n;i>=2*k+1;i--)cout<<i<<' ';
for(int i=1;i<=2*k;i+=2){
for(int j=max(2,i);j<=k*2;j*=2)cout<<j<<' ';
}
cout<<endl;
}
}

浙公网安备 33010602011771号