每一次写codeforce的时候都感觉好像智商不够用,各种套路脑洞。结果下来看题解又莫名.....
首先 我们需要知道0和1各出现了多少次,就好够造了,因为每增加一个0或者1 00,11的对数就会增加之前出现的0,才数个,求出了0,1的总个数以后我们先特判不可能的情况,很显然00,11的个数和==1的个数*0的个数。好了,现在来构造,考虑这样一个事实如果01的个数比1多说明了什么?说明之前一定有出现多个0来组合出01,所以每次添加一个0对于01的贡献就是还没有出现的1的个数,10同理。然后每次0--,1--
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int oo,ol,lo,ll,len,nl,no,c1,c0;
string ans;
int main(){
scanf("%d%d%d%d",&oo,&ol,&lo,&ll);
if(oo+lo+ol+ll==0)return printf("0"),0;
int num0=0,num1=0;
while(num0+c0<=oo)num0+=c0,c0++;
while(num1+c1<=ll)num1+=c1,c1++;
if(!lo&&!ol&&!oo)c0=0;
if(!ll&&!lo&&!ol)c1=0;
len=c1+c0;
if(c1*c0!=lo+ol||num0!=oo||num1!=ll)return printf("Impossible"),0;
for(int i=1;i<=len;i++){
if(ol>=c1){
printf("0");
ol-=c1;
c0--;
}else{
printf("1");
lo-=c0;
c1--;
}
}
return 0;
}