题意:
给你一个01串 长n,你有n次机会,每次flip其中恰好m个位置(也就是异或一个01串,恰好有m个1),如果原来的串变成全1了就结束,让你输出一个方案。
题解:
我。。懒得在敲一遍了,反正是队友写的代码,我就直接都复制粘贴了,为什么要写博客呢,,是因为看上去好像做了题目的样子,不写白不写
思路对了就行了,至于代码应该顺着写下去就好了
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i = (int)a;i<=(int)b;i++)
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=105;
const int inf=1e9+7;
int n,m,a[maxn],ans[maxn][maxn],cnt;
vector<int> ze,on,tmp,tze;
void out(){
printf("%d\n",cnt);
rep(i,1,cnt){
rep(j,1,n) printf("%d",ans[i][j]);
printf("\n");
}
}
void prin(vector<int> x,int mo){
int th[maxn]={0};
for(auto t:x){
th[t]=1;
}
if(mo!=-1) th[mo]=1;
cnt++;
for(int i=1;i<=n;i++){
ans[cnt][i]=th[i];
}
}
int main(){
int T; scanf("%d",&T);
while(T--){
ze.clear(); on.clear();
scanf("%d%d",&n,&m);
cnt=0;
rep(i,1,n) {
scanf("%1d",&a[i]);
if(a[i]) on.pb(i);
else ze.pb(i);
}
if(m==1){
printf("%d\n",ze.size());
for(int i=0;i<ze.size();i++){
int now=ze[i];
rep(j,1,n){
if(j==now) printf("1");
else printf("0");
}
printf("\n");
}
continue;
}
if(m==n){
if(ze.size()) {
if(ze.size()==n){
printf("1\n");
rep(i,1,n) printf("1");
printf("\n");
}
else printf("CATACLYSM IMMINENT - TIME TO HOARD FACE MASKS\n");
}
else printf("0\n");
continue;
}
if(ze.size()%2==0){
for(int i=0;i<ze.size();i+=2){
int fi=ze[i],se=ze[i+1];
tmp.clear();
for(int i=1;i<=n;i++) {
if(i!=fi&&i!=se) {
tmp.pb(i);
if(tmp.size()==m-1) break;
}
}
prin(tmp,fi); prin(tmp,se);
}
out();
continue;
}
else{
if(m%2==0) {
printf("CATACLYSM IMMINENT - TIME TO HOARD FACE MASKS\n");
continue;
}
int chod=1,chev=m-1,f=0;
while(1){
if(chod>m) break;
if(ze.size()>=chod&&on.size()>=chev){
if((ze.size()-chod+chev)==n) continue;
f=1;
break;
}
chod++; chev--;
}
if(!f) {
printf("CATACLYSM IMMINENT - TIME TO HOARD FACE MASKS\n");
continue;
}
tze.clear(); tmp.clear();
for(int i=0;i<ze.size();i++){
if(i<chod) {
tmp.pb(ze[i]);
}
else tze.pb(ze[i]);
}
for(int i=0;i<on.size();i++){
if(i<chev) {
tmp.pb(on[i]);
tze.pb(on[i]);
}
}
prin(tmp,-1);
for(int i=0;i<tze.size();i+=2){
int fi=tze[i],se=tze[i+1];
tmp.clear();
for(int i=1;i<=n;i++) {
if(i!=fi&&i!=se) {
tmp.pb(i);
if(tmp.size()==m-1) break;
}
}
prin(tmp,fi); prin(tmp,se);
}
out();
}
}
return 0;
}