求正解
查看原帖
求正解
551803
BPG_ning楼主2023/5/14 18:55
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=3e6+10;
int t,n,k;
int cnt,vis[N],p[N],f[N],a[N],ans[N];
int gcd(int a,int b){return (b==0?a:gcd(b,a%b));}
void oula(){
	for(int i=2;i<N;i++){
		if(vis[i]==0){p[++cnt]=i;} 
		for(int j=1;j<=cnt&&(p[j]*i)<N;j++){
			vis[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	}
	return ;
} 
int main(){
	ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	freopen("nzq.in","r",stdin);
	freopen("nzq.out","w",stdout);
	cin>>t;
//	oula();
	for(int c=1;c<=t;c++){
		cin>>n>>k;
		int dyz=1,cnt=0;
		if(k!=1){
			for(int i=2;i<=n/2;i++){
				int lyx=0,d=1;
				for(int j=1;j*i<=n;j++){
					if(f[i*j]||gcd(d,j)!=1) continue;
					f[i*j]=i;
					lyx++;
					a[++cnt]=i*j;
					d=j;
					if(lyx>=2) break;
				}
				if(lyx>=2) dyz++;
//				else if(lyx==1) f[a[cnt]]=0,a[cnt]=0,cnt--;
				if(dyz>=k) break;
			}
		}
		if(dyz<k){
			cout<<"No\n";
			continue;
		}
		cout<<"Yes\n";
		for(int i=1;i<=cnt;i++) cout<<a[i]<<' '; 
		for(int i=1;i<=n;i++) if(!f[i]) cout<<i<<' ';
		for(int i=1;i<=n;i++) f[i]=0;
	}
	return 0;
} 

想法是枚举gcd,但WA了

请问正解思路是什么

2023/5/14 18:55
加载中...