题意
你要构造一个只含有01的串,其中子序列:00有a个,01有b个,10有c个,11都d个。
如果不能,输出impossible
题解:
通过00和11,我们知道这个串里面0和1分别有多少个,然后我们就可以构造了。
假设0全部放在前面,1全部放在后面,那么如果把一个1扔到最前面,那么C就会减去当前0的个数。
然后我们就通过这个玩意儿去构造就好了
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-12
#define maxn 100100
#define MOD 1000000007
#define ll long long
long long a,b,c,d;
long long ok(long long x)
{
for(long long i = 1; i * (i-1) <= x; i++)
if(x == i * (i-1))
return i;
return 0;
}
int main()
{
int T;
while(scanf("%lld%lld%lld%lld",&a,&b,&c,&d) != EOF)
{
long long sum = a + b + c + d;
long long len = ok(sum*2);
long long x1 = ok(a*2),x2 = ok(d*2);
//printf("%lld %lld %lld\n",len,x1,x2);
if(!sum)
{
printf("0\n");
continue;
}
if(len && (sum == a || sum == d))
{
for(int i = 0; i < len; i++)
printf("%d",sum == a?0:1);
printf("\n");
continue;
}
if(!len || !x1 || !x2 || x1+x2 != len)
{
printf("Impossible\n");
continue;
}
long long bb = x1 * x2,cc = 0;
//printf("%lld %lld\n",bb,cc);
if(bb + cc != b + c)
{
printf("Impossible\n");
continue;
}
long long A = x1;
for(long long i = 0; i < len; i++)
{
if(c - cc >= A)
{
cc += A;
printf("1");
}
else
{
A--;
printf("0");
}
}
printf("\n");
}
return 0;
}