Genius's Gambit
给出a,b,k要求构造两个二进制数满足有a个0,b个1,它们的差有k个1。(0不包含前导0)
发现这两个数的数码组成没有改变,考虑加法,不妨加上一个\(2^k-1\)那么如果最后一位原来是1,现在就会移动到第k+1位的位置,那么相当于只有这一位发生变化,那么其它位可以用来放1,所以我们只需要判断一些特殊情况,对于\(k\le a+b-2\)的情况都是可以构造的。
#include<bits/stdc++.h>
#define LL long long
#define I inline int
#define V inline void
#define FOR(i,a,b) for(register int i=a,end##i=b;i<=end##i;++i)
#define REP(i,a,b) for(register int i=a,end##i=b;i>=end##i;--i)
#define go(i,a) for(register int i=hed[a];i;i=e[i].pre)
using namespace std;
inline int read()
{
char x='\0';
int fh=1,sum=0;
for(x=getchar();x<'0'||x>'9';x=getchar())if(x=='-')fh=-1;
for(;x>='0'&&x<='9';x=getchar())sum=sum*10+x-'0';
return fh*sum;
}
const int N=2e5+9;
int a,b,k;
int ans[N];
int main()
{
a=read(),b=read(),k=read();
if(k==a+b)return printf("No\n"),0;
if(k==0)
{
printf("Yes\n");
FOR(i,1,b)printf("1");
FOR(i,1,a)printf("0");
printf("\n");
FOR(i,1,b)printf("1");
FOR(i,1,a)printf("0");
return 0;
}
if(a==0||b==1||k==a+b-1) return printf("No\n"),0;
printf("Yes\n");
ans[a+b]=1,ans[k+1]=1,ans[1]=0;
int cnt=b-2;
FOR(i,2,a+b-1)
{
if(cnt&&i!=k+1)
{
ans[i]=1;
cnt--;
}
}
REP(i,a+b,1)printf("%d",ans[i]);
printf("\n");
ans[k+1]=0,ans[1]=1;
REP(i,a+b,1)printf("%d",ans[i]);
return 0;
}