社区讨论

Wa on #13,求调

P10034「Cfz Round 3」Circle参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhj2ueum
此快照首次捕获于
2025/11/03 19:49
4 个月前
此快照最后确认于
2025/11/03 19:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n,l,v[500005],f[500005],a[500005],c,p[500005],p1[500005],p2[500005],p3[500005],e,c1,c2,c3,t[500005],ar[500005];
char s[500005]; 
signed main(){
	for(int i=2;i<=500000;i++){
		if(v[i])continue;
		for(int j=2*i;j<=500000;j+=i)v[j]=1;
	}
	cin>>T;
	while(T--){
		cin>>n>>l;c=0;c1=c2=c3=0;
		cin>>(s+1);int o=0;
		for(int i=1;i<=n;i++)if(s[i]=='1')o++;
		if(o==0){
			for(int i=1;i<n;i++){
				cout<<i+1<<" ";
			}
			cout<<1<<" ";
			continue;
		}
		for(int i=2;i<n-1;i++){
			if(l%i==0&&!v[i])a[++c]=i;
		}
		f[0]=1;
		for(int i=1;i<=c;i++){
			for(int j=a[i];j<=n;j++)f[j]|=f[j-a[i]];
		}
		int rt=0;
		for(int i=o;i<=n;i++)if(f[i])rt=i;
		if(rt==0){
			cout<<-1<<"\n";
			for(int i=1;i<=n;i++)f[i]=0;
			continue;
		}
		int x=rt;
		for(int i=1;i<=c;i++){
			while(x>=a[i]&&f[x-a[i]])x-=a[i],p1[++c1]=a[i];
		}
		for(int i=1;i<=n;i++){
			if(s[i]=='1')p2[++c2]=i;
			else p3[++c3]=i;
		}
		int r1=1,r2=1;
		for(int i=1;i<=c1;i++){
			e=0;
			while(r1<=c2){
				t[++e]=p2[r1];r1++;
				if(e==p1[i])break;
			}
			while(r2<=c3){
				if(e==p1[i])break;
				t[++e]=p3[r2];r2++;
				if(e==p1[i])break;
			}
			for(int i=1;i<e;i++)ar[t[i]]=t[i+1];
			ar[t[e]]=t[1];
		}e=0;
		while(r2<=c3){
			t[++e]=p3[r2];r2++;
		}
		for(int i=1;i<e;i++)ar[t[i]]=t[i+1];
		ar[t[e]]=t[1];
		if(e==1){
			cout<<-1<<"\n";
			continue;
		}
		for(int i=1;i<=n;i++)cout<<ar[i]<<" ",f[i]=0;cout<<"\n";
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...