我也没想到会ac,是数据问题还是这个方法对?复杂度虽然能过但是很勉强,我纳闷的地方在于我在第一个for循环里面已经把k个不同的gcd算出来了,在后面输出剩下的个数的时候,有没有可能会存在另一个不在里面的gcd?
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int t,n,m,k;
bool vis[N],st[N];
void solve()
{
cin>>n>>k;
int num=0;
vector<int>g;
if(k>n/2) return cout<<"No"<<endl,void();
cout<<"Yes"<<endl;
memset(vis,false,sizeof vis);
for(int i=1;i<=n/2;i++){
if(num>=k) break;
if(!vis[i]){
vis[i]=true,cout<<i<<' ';
int j=i;
while(j*2<=n&&!vis[j*2]&&num<k) num++,j*=2,cout<<j<<' ',vis[j]=true;
if(num>=k) break;
}
}
for(int i=1;i<=n;i++) if(!vis[i]) cout<<i<<' ';
cout<<endl;
}
int main()
{
cin>>t;
while(t--) solve();
return 0;
}