[CF1492D] Genius's Gambit - 构造
Description
给定你三个整数 \(a,b,k\) ,满足 \(0\le a;1 \le b;k \le a + b \le 2\times10^5\)。请你构造出两个二进制形式的整数 \(x,y\),满足 \(x \ge y\),\(x,y\) 的二进制形式由 \(a\) 个 \(0\),\(b\) 个 \(1\) 组成,并且 \(x - y\) 得到的数在二进制下共有 \(k\) 个 \(1\)。如果存在合法构造,请输出 \(\texttt{Yes}\) ,并输出合法的 \(x,y\)。
Solution
从高往低数,第 1 位肯定要填 1,第 2 位 x 填 1 y 填 0,第 2+k 位 y 填 1 x 填 0,其它位随便填,保持两个一样,凑够 b 个 1 即可
这样构造显然是符合条件的,但需要考虑,无法这样构造的情况是否一定无解
考虑 k>0 的情况,这样构造,至少需要 2 个 1,1 个 0
如果 a=0,那么显然是构造不出来的
如果 a>0, b=1,因为第一位必须填 1,所以显然也是构造不出来的
第一位减出来一定相同,后面无论如何要剩一位,所以 k 最多只能到 a+b-2,否则无解
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);
int a, b, k;
cin >> a >> b >> k;
int n = a + b;
vector<int> x(n + 2), y(n + 2);
if ((k > 0 && (a < 1 || b < 2 || a + b - 2 < k)))
{
cout << "No";
}
else
{
x[1] = y[1] = 1;
if (b > 1)
{
x[2] = 1;
y[2 + k] = 1;
int cnt = b - 2;
for (int i = 3; i <= n; i++)
if (i != 2 + k && cnt)
cnt--, x[i] = y[i] = 1;
}
cout << "Yes" << endl;
for (int i = 1; i <= n; i++)
cout << x[i];
cout << endl;
for (int i = 1; i <= n; i++)
cout << y[i];
cout << endl;
}
}