社区讨论
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 条回复,欢迎继续交流。
正在加载回复...