For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x, y}.
In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.
The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.
If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.
1 2 3 4
Impossible
1 2 2 1
0110
分析:根据00 和 11的个数我们可以确定整个串的长度,然后假设初始状态左边全是1,右边全是0,我们可以通过不断移动1来构造出01为任意值的合法状态,注意特判都是0和只有1或0的情况。
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
#include <unordered_map>
#define INF 0x3f3f3f3f
#define eps 1e-9
#define MOD 1000000007
#define MAXN 200005
using namespace std;
typedef long long ll;
ll a,b,c,d;
ll got(ll x)
{
ll tmp = sqrt(1+8*x);
if(tmp*tmp != 1+8*x || tmp & 1 == 0) return -1;
return (1+tmp)/2;
}
int main()
{
scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&d);
if(a + b + c + d == 0)
{
cout<<1<<endl;
return 0;
}
if(a*d == 0 && b + c == 0)
{
ll A = got(a),D = got(d);
if((a && A < 0) || (d && D < 0))
{
cout<<"Impossible"<<endl;
return 0;
}
if(a > 0) for(int i = 1;i <= A;i++) cout<<0;
else for(int i = 1;i <= D;i++) cout<<1;
return 0;
}
ll tmp = got(a+b+c+d);
a = got(a),d = got(d);
if(a < 0 || d < 0 || tmp != a + d)
{
cout<<"Impossible"<<endl;
return 0;
}
int l = b/a;
if(b % a) l++;
for(int i = 1;i <= d - l;i++) cout<<1;
for(int i = 1;i <= a;i++)
{
cout<<0;
if(i == (b % a)) cout<<1;
}
if(b % a) l--;
for(int i = 1;i <= l;i++) cout<<1;
}