代码求调,救命
查看原帖
代码求调,救命
638617
yukiho1832楼主2024/1/22 17:43
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
ll t,n,l;
string s;
bitset<500005>fl;
ll pri[500005],cnt=0;
ll a[20],ca;
int st;
void pre(){//筛质数
	cnt=0;
	fl=0;
	for(int i=2;i<=n;i++){
		if(!fl[i]){
			pri[++cnt]=i;
			for(int j=2;j*i<=n;j++){
				fl[j*i]=1;
			}
		}
	}
}
void fpri(){//判断小于等于n的质数
	ca=0;
	for(int i=1;i<=cnt;i++){
		if(l%pri[i]==0) a[++ca]=pri[i];
	}
}
bool f[500005];
bool ok=0;
vector<int>gz[500005];
vector<int>one;
int ans[500005];
int main(){
	cin>>t;
	while(t){
		t--;
		cin>>n>>l>>s;
		if(l==0){
			cout<<n<<' ';
			for(int i=1;i<=n-1;i++) cout<<i<<' ';putchar('\n');
			continue;
		}
		pre();
		fpri();
		//for(int i=1;i<=ca;i++) cout<<a[i]<<' ';putchar('\n');
		st=0;
		one.clear();
      		//求1的个数
		for(int i=0;i<s.size();i++){
			if(s[i]=='1'){
				st++;
				one.push_back(i+1);
			}
		}
		//cout<<st<<'\n';
    		//初始化
		for(int i=1;i<=n;i++) f[i]=0;
		for(int i=1;i<=ca;i++) f[a[i]]=1;
		for(int i=1;i<=n;i++) gz[i].clear();
		for(int i=1;i<=ca;i++) gz[a[i]].push_back(a[i]);
      		//背包
		for(int i=1;i<=n;i++){
			if(f[i]){
				for(int j=1;j<=ca;j++){
					if(i+a[j]<=n && !f[i+a[j]]){
						for(int k=0;k<gz[i].size();k++) gz[i+a[j]].push_back(gz[i][k]);
						gz[i+a[j]].push_back(a[j]);
						f[i+a[j]]=1;
					}
				}
			}
		}
		//for(int i=1;i<=n;i++) cout<<f[i]<<' ';putchar('\n');
		ok=0;
		ll gs;
		for(int m=st;m<=n;m++){
			if(m==n-1) continue;
			if(f[m]){
				ok=1;
				gs=m;
				break;
			}
		}
		if(!ok) cout<<"-1\n";
		else{
			//cout<<gs<<'\n';
			for(int i=1;i<=n;i++) ans[i]=i;
          		//把0加进来凑数
			for(int i=0;one.size()<n;i++){
				if(s[i]=='0') one.push_back(i+1);
			}
			int j=0;
			//for(int i=0;i<gz[gs].size();i++) cout<<gz[gs][i]<<' ';putchar('\n');
			gz[gs].push_back(n-gs);
          		//循环位移
			for(int i=0;i<gz[gs].size();i++){
				int lh=gz[gs][i];
				if(lh==0) continue;
				//one[j]~one[j+lh-1];
				ll tmp=ans[one[j]];
				for(int k=j;k<=j+lh-1-1;k++){
					ans[one[k]]=ans[one[k+1]];
				}
				ans[one[j+lh-1]]=tmp;
				j+=lh;
			}
			for(int i=1;i<=n;i++) cout<<ans[i]<<' ';putchar('\n');
		}
	}
	return 0;
}

救救孩子。。。

2024/1/22 17:43
加载中...