Genius's Gambit

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;
}



 
上一篇:Java字符串去掉空格的几种方法


下一篇:Codeforces Round #708 (Div. 2) D. Genius 动态规划