题解 CF1355D 【Game With Array】

· · 题解

【构造】【CF1355D】 Game With Array

Analysis

首先 s \geq 2n 的时候,显然可以构造一个 \{2, 2, 2, \cdots, s - 2n + 2\} 的序列,因为 s \geq 2n,所以 s -2n + 2 \geq 2。取 k = 1,一定凑不出来。

s \lt 2n 的时候,可以通过手玩几组发现无解。我们来尝试证明这个结论。

反证法,假设当 s \lt 2n 时,存在一个整数 k 和一个和为 s 序列 a,满足 a 不存在和为 k(s - k) 的子列。

考虑对于序列 a,做出其前缀和数组 b。对于每一个 b_i,我们标记所有值为 b_i + ts 的整数,其中 t 是满足 0 \leq t \lt 2k 的整数,另外标记整数 0。则对于任意正整数 xxx + k 不能被同时标记(否则考虑设 u \equiv x \pmod sv \equiv x + k \pmod s,则 uv 是标记 xx + k 的数。而 v - u \equiv x + k - x \equiv k \pmod s。换句话说,如果 vb 中的对应位置在 u 后面,则 v - u = k,存在和为 k 的子列,否则 u - v = s - k,存在和为 s - k 的子列,与假设不符)。

考虑对于 [0, 2ks) 的所有整数,我们这样分组:

(0, k)$,$(1, k + 1)$,$(2, k + 2)$,$\cdots$ ,$(k - 1, 2k - 1) (2k, 3k)$,$(2k+ 1, 3k + 1)$,$(2k + 2, 3k + 2)$,$(2k + 3, 3k + 3)$,$\cdots \cdots 也即将 $x$ 与 $x + k$ 分在一组。注意到这样一共有 $ks$ 组数对。任意一对数之间都至多能标记一个。因此最多能标记 $ks$ 个数。但是考虑一共有 $n$ 个互不相同前缀和值,每个数可以标记 $2k$ 个整数,加上另外标记的 $0$ 并去掉 $b_n + (2k - 1)s = 2ks$不在区间中,实际上一共标记了 $2nk$ 个整数。因为 $s \lt 2n$,所以 $2nk \gt ks$。实际标记数多于最多能标记的个数,矛盾。 没有给出证明的题解都被我撤下来了。 ### Code ```cpp namespace Fusu { int n, s; void Main() { qr(n); qr(s); if ((n << 1) > s) { puts("No"); } else { puts("Yes"); for (int i = 1; i < n; ++i) { qw(2, ' '); s -= 2; } qw(s, '\n'); puts("1"); } } } // namespace Fusu ```