求大佬证明或者说一下为什么正确
查看原帖
求大佬证明或者说一下为什么正确
784813
SakurajiamaMai楼主2023/10/10 10:49

我也没想到会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;
}
2023/10/10 10:49
加载中...