原题链接:https://codeforces.com/contest/1492/problem/D
题意:给a,b,k三个整数
构造两个二进制数x,y必须有a个0和b个1。注意开头必须为1。要求a-b的二进制形式恰好有k个1。
原以为必须保证a>=k,看了他人的题解发现b-2>=k-a也能符合条件。
当像是111000-101001=1111,把x的全部0全放后面,y的末位置1,则已经有a个1了,剩下还要构造k-a个,把原本y末位的0要放到前面,则这个0后面需要连续k-a个1。
a>=k的情况很容易求解;当a<k且a+b-2>=k时,发现规律,a+b-0的位置=k,那么0的位置就应该在a+b-k。
注意下边界情况,如b=1时或a=0,k必须为0。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int a,b,k,ans1[maxn],ans2[maxn];
void print(int x,int len){
for(int i=1;i<=len;i++)
printf("%d",x);
}
int main(void){
scanf("%d%d%d",&a,&b,&k);
if(k==0){
printf("Yes\n");
print(1,b);print(0,a);printf("\n");
print(1,b);print(0,a);printf("\n");
}
else if(b==1||a==0){
printf("No\n");
}else if(k<=a+b-2){
for(int i=1;i<=a+b;i++){
if(i<=b)ans1[i]=ans2[i]=1;
else ans1[i]=ans2[i]=0;
}
if(a<k){
printf("Yes\n");
swap(ans2[a+b],ans2[a+b-k]);
for(int i=1;i<=a+b;i++)printf("%d",ans1[i]);
printf("\n");
for(int i=1;i<=a+b;i++)printf("%d",ans2[i]);
printf("\n");
}else{
if((a-k>=1&&b==1)||(a>=1&&b==1)){
printf("No\n"); return 0;
}
printf("Yes\n");
for(int i=1;i<b;i++)printf("1");
for(int i=1;i<=a-k;i++)printf("0");
printf("1");
for(int i=1;i<=k;i++)printf("0");
printf("\n");
for(int i=1;i<b;i++)printf("1");
for(int i=1;i<=a;i++)printf("0");
printf("1\n");
}
}else printf("No\n");
return 0;
}