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

相关文章:

  • 2022-12-23
  • 2021-12-05
  • 2021-10-01
  • 2022-12-23
  • 2022-12-23
  • 2021-06-21
猜你喜欢
  • 2022-02-02
  • 2021-11-27
  • 2022-01-11
  • 2022-02-23
  • 2022-12-23
  • 2021-10-14
相关资源
相似解决方案