CF1492 D. Genius's Gambit
题意:
给出a b k,构造两个二进制数x和y(x>=y,不能有前导0),使x-y的二进制有k个1
1XXX0
0XXX1
手算可以发现,若x有一段以1开头以0结尾,长为L的区间,对应的y这一段为以0开头以1结尾,中间的x和y都一样
那么这一段区间相减的结果是L-1个1和1个0
按照这个思路可以构造出相减的结果为先有1个0然后有k个1,后面都是0
这样构造的要求是至少有1个0且至少有2个1(开头是1,还有1个上面说的区间里的1)且k<=a+b-2
所以要对这些情况进行特判
k=0也要特判
#include<cstdio> char s[200002],t[200002]; int main() { int a,b,k,p; scanf("%d%d%d",&a,&b,&k); p=a+b; if(b==1) { if(!k) { printf("Yes\n"); printf("1"); for(int i=1;i<=a;++i) printf("0"); printf("\n1"); for(int i=1;i<=a;++i) printf("0"); } else printf("No"); } else { if(!k) { printf("Yes\n"); for(int i=1;i<=b;++i) s[i]=t[i]='1'; for(int i=1;i<=a;++i) s[b+i]=t[b+i]='0'; s[a+b+1]=t[a+b+1]='\0'; printf("%s\n%s",s+1,t+1); } else if(!a) { if(!k) { printf("Yes\n"); for(int i=1;i<=b;++i) s[i]=t[i]='1'; for(int i=1;i<=a;++i) s[b+i]=t[b+i]='0'; s[a+b+1]=t[a+b+1]='\0'; printf("%s\n%s",s+1,t+1); } else printf("No"); } else if(k<=a+b-2) { s[1]=t[1]='1'; s[2]='1'; t[2]='0'; b-=2; a-=1; for(int i=1;i<=k-1;++i) { if(b) { s[i+2]=t[i+2]='1'; --b; } else { s[i+2]=t[i+2]='0'; --a; } } s[k+2]='0'; t[k+2]='1'; for(int i=k+3;a||b;++i) { if(a) { s[i]=t[i]='0'; --a; } else { s[i]=t[i]='1'; --b; } } s[p+1]=t[p+1]='\0'; printf("Yes\n%s\n%s",s+1,t+1); } else printf("No"); } }