AIM Tech Round 3 (Div. 1) B. Recover the String(构造)

185 篇文章 0 订阅
116 篇文章 0 订阅
B. Recover the String
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Input

The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.

Output

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.

Examples
Input
1 2 3 4
Output
Impossible
Input
1 2 2 1
Output
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;
 } 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值