文章目录

题目链接:

http://codeforces.com/gym/101933/problem/J

题意:给4个数a,b,c,让构造01串,使得子序列子序列中 00 的个数是 a 个,01 是b个,10是c个,11是d个

这道题其实思路是比较好想的,关键就是特判
哇WA得我很无语,用来比赛的话真是道好题啊

第三组数据应该就是4个数都是0的时候,改了这个我就过了第三组T_T

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int MOD=1e9+7;
vector<int>vec;
int main()
{
	LL a,b,c,d;
	while(cin>>a>>b>>c>>d)
	{
		if(a==0 && b==0 &&c==0 && d==0)
		{
			puts("0");
			continue;
		}
		LL zero=sqrt(2*a);
		if(zero*(zero+1)/2!=a)
		{
			puts("impossible");
			continue;
		}
		LL one=sqrt(2*d);
		if(one*(one+1)/2!=d)
		{
			puts("impossible");
			continue;
		}
		zero++,one++;

		/*开始特判*/
		if(a==0 && d==0)
		{
			if(b==1 && c==0)
			{
				puts("01");
				continue;
			}
			else if(b==0 && c==1)
			{
				puts("10");
				continue;
			}
			else
			{
				puts("impossible");
				continue;
			}
		}
		if(b==0 && c==0)
		{
			if(d==0)
			{
				while(zero-->0)cout<<0;
				cout<<endl;
				continue;
			}
			else if(a==0)
			{
				while(one-->0)cout<<1;
				cout<<endl;
				continue;
			}
		}
		
		if(zero*one!=b+c)puts("impossible");
		else
		{
			LL x=b/one,y=b%one;//x表示全在1前面0的个数
			while(x-->0)
			{
				cout<<0;
				zero--;
			}
			LL t=one-y;//剩余0前面的1的个数
			while(t-->0)
			{
				cout<<1;
				one--;
			}
			if(zero>0)
			{
				cout<<0;
				zero--;
			}
			while(one-->0)cout<<1;
			while(zero-->0)cout<<0;
			cout<<endl;
		}
	}
}