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; }
原文地址:https://www.cnblogs.com/zxyqzy/p/10127239.html