模拟
首先可以求出 0 和 1 的个数
之后按照01 10 的个数贪心安排
细节太多 错的都要哭了
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c,d; while(~scanf("%d %d %d %d",&a,&b,&c,&d)) { int suc = 1; int t1,t2; t1 = sqrt(2*a); t2 = sqrt(2*d); t1 ++; t2 ++; if(t1*(t1-1) != 2*a || t2*(t2-1) != 2*d) suc = 0; if(d == 0) { if(!suc) printf("Impossible "); else if(b == 0 && c == 0) { for(int i = 0; i < t1; ++i) printf("0"); printf(" "); }else if(b+c == t1) { if(t1 == 1) { if(b) printf("01 "); else printf("10 "); continue; } int cc = 0; if(cc == b) printf("1"); for(int i = 0; i < t1; ++i) { printf("0"); cc ++; if(cc == b) printf("1"); } printf(" "); } else printf("Impossible "); continue; }else if(a == 0) { if(!suc) printf("Impossible "); else if(b == 0 && c == 0) { for(int i = 0; i < t2; ++i) printf("1"); printf(" "); }else if(b+c == t2) { int cc = 0; if(cc == c) printf("0"); for(int i = 0; i < t2; ++i) { printf("1"); cc ++; if(cc == c) printf("0"); } printf(" "); } else printf("Impossible "); continue; } if(b+c != t1*t2) suc = 0; int num1 = 0, pos1 = 0; num1 = c/t1; pos1 = c%t1; int all = num1 + (pos1 > 0); if(all > t2) suc = 0; if(suc) { for(int i = 0; i < num1; ++i) printf("1"); int cc = t1; for(int i = 0; i < t1; ++i) { cc --; printf("0"); if(cc == pos1 && cc != 0) printf("1"); } for(int i = 0; i < t2-all; ++i) printf("1"); printf(" "); } else printf("Impossible "); } return 0; }