CF708B Recover the String 构造

Posted zxyqzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF708B Recover the String 构造相关的知识,希望对你有一定的参考价值。

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
Copy
1 2 3 4
Output
Copy
Impossible
Input
Copy
1 2 2 1
Output
Copy
0110

 

 

首先从a00和a11可以求出0和1的数量;

假设目前为0000...001111..;

显然a01=num0*num1,a10=0;

那么我们移动一个1去左边,a10++,a01--;但总数还是不变;

那么合理的解必须是a10+a01=num0*num1;

值得注意的是:当00或11=0时,0或1可能有1个也可能没有;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 1000005
#define inf 0x3f3f3f3f
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair<int, int> pii;
#define pi acos(-1.0)
const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
	ll x = 0;
	char c = getchar();
	bool f = false;
	while (!isdigit(c)) {
		if (c == ‘-‘) f = true;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return f ? -x : x;
}

ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }

/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1; y = 0; return a;
	}
	ans = exgcd(b, a%b, x, y);
	ll t = x; x = y; y = t - a / b * y;
	return ans;
}
*/
int a00, a01, a10, a11;

int main()
{
	//ios::sync_with_stdio(0);
	rdint(a00); rdint(a01); rdint(a10); rdint(a11);
	int k = 1, r = 1;
	while (k*(k - 1) / 2 < a00)k++;
	while (r*(r - 1) / 2 < a11)r++;
//	cout << k << ‘ ‘ << r << endl;
	int fg = 1;
	if (k*(k - 1) / 2 != a00 || r * (r - 1) / 2 != a11) {
		cout << "Impossible" << endl; return 0;
	}
	
	else if (a00 == 0 && a11 == 0) {
		if (a01 == 0 && a10 == 0)cout << 0 << endl;
		else if (a01 == 0 && a10 == 1)cout << "10" << endl;
		else if (a01 == 1 && a10 == 0)cout << "01" << endl;
		else cout << "Impossible" << endl;
		return 0;
	}
	else if (a00 == 0) {
		if (a01 == 0 && a10 == 0) {
			while (r--)cout << ‘1‘;

		}
		else if (a01 + a10 == r) {
			while (a10--)cout << ‘1‘;
			cout << 0;
			while (a01--)cout << ‘1‘;
		}
		else fg = 0;
	}
	else if (a11 == 0) {
		if (a10 == 0 && a01 == 0) {
			while (k--)cout << ‘0‘;
		}
		else if (a10 + a01 == k) {
			while (a01--)cout << 0;
			cout << 1;
			while (a10--)cout << 0;
		}
		else fg = 0;
	}

	else {
		if (a01 + a10 == k * r) {
			while (a01) {
				while (r > a01) {
					cout << 1;
					r--;
				}
				cout << 0;
				k--; a01 -= r;
			}
			while (r--)cout << 1;
			while (k--)cout << 0;
		}
		else fg = 0;
	}
	if (fg == 0)cout << "Impossible" << endl;
	return 0;
}

 

以上是关于CF708B Recover the String 构造的主要内容,如果未能解决你的问题,请参考以下文章

题解Recover the String Codeforces 708B

cf708B. Recover the String---(构造法)

Codeforces 708B. Recover the String

1038 Recover the Smallest Number string还能这样用 cmp真滴强大

PAT1038. Recover the Smallest Number

codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)