Problem

Recall that a subsequence of a string is any string obtained by removing some subset of characters from the string, for instance “string”, “sing”, “i” and “sg” are all subsequences of “string”. If the same subsequence can be obtained in exactly t different ways, by removing different subsets of characters, we say that the subsequence occurs t times.

Jingfei wants to create a nonempty bit string that has the following properties:

  1. the subsequence 00 occurs a  times,

  • the subsequence 01 occurs b times,

  • the subsequence 10 occurs c  times, and

  • the subsequence 11 occurs d    times.

However, Jingfei does not know how to create such a string – or whether it is even possible. Could you help her?

Input

The input consists of a single line with four integers a, b, c, and d (0≤a,b,c,d≤1e9).

Output

Output a bit string that satisfies the given requirements. If there are several solutions, output any one of them. If there are no solutions, output “impossible”.

Sample Input 1 Sample Output 1
3 4 2 1
01001
Sample Input 2 Sample Output 2
5 0 0 5
impossible

题解 :不需要考虑00、11,根据a个00和d个11来算出来需要的0的个数x,1的个数y。

找答案字符串时,凑01,这样10也满足条件。

设q = b / y,w = b % y。这样先输出时,输出q个0,输出y-w个1,这样就保证了有q*(y-w)个01,如果w == 0,表示刚好能够用上所有的1来组成01,再把剩余的输出1和0就可以了。但是如果q != x,即不需要把0全部输出,那样q*(y-w)> b,所以把0剩余提前到1前面,eg:现在有3个0,3个1,我们只需要7个01,按着这种想法,如果输出001110(代码如果没考虑)或者是000111,这样就会多答案或者少答案,所以应该是001101,所以要判断一下余下的,把0调前一个,让正好能够是7个01就可以了,相应的最后的输出0个数要-1。

其次加上特判,a、b、c、d分别为0和部分为0的时候的特判。(自己好菜。。%队友)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,c,d,abc;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
if(a==0&&b==0&&c==0&&d==0)
{
printf("0\n");
return 0;
}
ll x,y,i;
x = (1 + sqrt(1+8*a)) / 2;
if(x*(x-1)/2 != a)
{
printf("impossible\n");
return 0;
}
y = (1 + sqrt(1 + 8*d)) / 2;
if(y*(y-1)/2 != d)
{
printf("impossible\n");
return 0;
}
if(a == 0&&d == 0)
{
if(b == 1&&c == 0)
{
printf("0");
printf("1\n");
}
else if(c == 1&&b==0)
{
printf("1");
printf("0\n");
}
else printf("impossible\n");
return 0;
}
if(b==0&&c==0)
{
if(a==0)
{
for(i=1;i<=y;i++) printf("1");
printf("\n");
}
else if(d==0)
{
for(i=1;i<=x;i++) printf("0");
printf("\n");
}
else printf("impossible\n");
return 0;
}
if(x*y != b+c)
{
printf("impossible\n");
return 0;
}
ll j,q,w;
q = b / y;
w = b % y;
for(i=1;i<=q;i++) printf("0");
for(i=1;i<=y-w;i++) printf("1");
if(q!=x)
printf("0");
for(i=1;i<=w;i++) printf("1");
for(i=1;i<=x-q-1;i++) printf("0");
return 0;
}

最新文章

  1. C++远征之封装篇(下)
  2. java并发包:线程池 executorservice
  3. JSWindow对象
  4. 结果集(result set)解释与用法
  5. Linux 删除文件中某一行的方法
  6. js运动框架 step by step
  7. C# winform程序怎么打包成安装项目(图解)
  8. CentOS常用查看系统命令
  9. Cocos2d-X学习之Ref类
  10. DOG角点检测——opencv实现
  11. s15day14 ssh秘钥远程连接
  12. 搭建VUE项目的准备(利用vue-cli来构建项目)
  13. C语言最后一次博客作业
  14. MongoDB下载安装测试及使用
  15. 2#第一个Java程序
  16. git GUI设置长期记住密码
  17. 为什么二流程序员都喜欢黑php?
  18. 【python】mongo删除数据
  19. 阿里云物联网平台体验(树莓派+Python篇)
  20. 移动开发学习touchmove

热门文章

  1. PHP代码多人开发
  2. stm32 usart 串口
  3. Vue粒子特效(vue-particles插件)
  4. spring-security配置和原理简介
  5. tornado 常见问题处理
  6. 通过docker搭建ELK集群
  7. java 接口方法超时异常处理 设置超时时间
  8. ndk学习之C语言基础复习----指针、函数、预处理器
  9. mysql打开报错2013解决办法
  10. 使用Tampermonkey,实现Gitlab禁用自我Merge的功能