Official

D - |A + A| Editorial by sounansya


小さいケースで実験すると、以下のケースでのみ答えが No になることが分かります。

  • \(K=2\) かつ \(M\)\(2\) の倍数ではない。
  • \(K=4\) かつ \(M\)\(4\) の倍数ではない。

実際に、大きいケースでもこれらのケースの答えは No になります。


[1] \(K=2\) かつ \(M\)\(2\) の倍数ではない場合

合同式は全て \(\text{mod}\ M\) で考えます。

まず、 \(K=2\) より \(A\) の長さは \(2\) である必要があります。(ただし \(A_1\neq A_2\)

\(A_i+A_j\) として表される値は \(2A_1,2A_2,A_1+A_2\)\(3\) 通りです。これらのうちどれか \(2\) つが \(\text{mod}\ M\) で同じ値である必要があります。 \(A_1 \neq A_2\)\(M\) が奇数であることから \(2A_1 \not\equiv 2A_2 \pmod M\) が成り立つので、 \(A_1+A_2\)\(2A_1,2A_2\) のどちらかが \(\text{mod}\ M\) で同じ値である必要があります。しかし、 \(2A_1\equiv A_1+A_2\) とすると \(A_1\equiv A_2\) となり、これは \(A_1\neq A_2\) に矛盾します。\(2A_2\equiv A_1+A_2\) の場合も同様です。

[2] \(K=4\) かつ \(M\)\(4\) の倍数ではない場合

\(A\) の長さが \(2\) 以下ならば \(k\) としてあり得る値は \(3\) 種類以下です。一方、 \(A\) の長さが \(5\) 以上ならば \(k\) としてあり得る値は \(5\) 種類以上になります。したがって、 \(A\) の長さとしてあり得る値は \(3,4\)\(2\) つのみです。

[2-1] \(A\) の長さが \(3\) の場合

\(A=(a,b,c)\)\(a,b,c\) は互いに相異なる)とします。

このとき、 \(2a,2b,2c,a+b,b+c,a+c\) のうちちょうど \(2\) 組が \(\text{mod}\ M\) で同じ値である必要があります。

それぞれの値を頂点として考え、\(\text{mod}\ M\) で同じ値ならば辺を結ぶようなグラフを考えると対称性より \(2a\)\(b+c\)\(2b\)\(2c\) がそれぞれ \(\text{mod} \ M\) で同じ値である場合のみ考えれば良いです。

\(M\) が奇数ならば \(2b\equiv 2c\pmod M\) より \(b\equiv c\pmod M\) が言えますが、このとき \(2a\equiv b+c\equiv 2c\pmod M\) となり不適です。

\(M\) が偶数なら \(b\equiv c\pmod M\) または \(\displaystyle b\equiv c+\frac{M}{2} \pmod M\) となりますが、前者は奇数の場合と同じように不適で、後者も \(\displaystyle 2a-2b\equiv b+c-2b\equiv \frac{M}2\pmod M\) より不適です。

[2-2] \(A\) の長さが \(4\) の場合

\(A=(a,b,c,d)\)\(a,b,c,d\) は互いに相異なる)とします。

\(B_x=(a+x,b+x,c+x,d+x) \pmod M\) とします(つまり、各要素を全て \(\text{mod}\ M\) で割ったとする)。このとき、\(B_x\) の各要素は相異なるので \(B_a,B_b,B_c,B_d\) は全て集合として一致します。よって、 \(A\) の公差、つまり \(b-a,c-b,d-c,a-d\)\(\text{mod}\ M\) で全て等しい必要がありますが、 \(M\)\(4\) の倍数ではないのでそのような \(A\) を構築することは不可能です。


以上が No の場合の証明です。これ以外のケースは全て Yes で、以下のように構築することができます。

  • \(K=M\) の場合:\(\displaystyle A=(0,1,\ldots,M-1)\)
  • \(K=2\) の場合: \(\displaystyle A=(0,M/2)\)
  • \(K=4\) の場合: \(\displaystyle A=(0,M/4,2M/4,3M/4)\)
  • \(K\)\(6\) 以上の偶数の場合: \(\displaystyle A=(0,2,3,\ldots,K/2)\)
  • \(K\) が奇数の場合: \(\displaystyle A=(0,1,2,\ldots,(K-1)/2)\)

\(2\) つは明らかで、\(K\) が偶数の場合は \(0,2,3,\ldots,K\)\(K\) 種類が、 \(K\) が奇数の場合は \(0,1,2,\ldots,K-1\)\(K\) 種類が現れることが分かります。

実装例(Python3)

for _ in range(int(input())):

    def y(a):
        print("Yes")
        print(len(a))
        print(*a)

    m, k = map(int, input().split())
    if m == k:
        y([i for i in range(m)])
        continue
    if k == 2:
        if m % 2 == 0:
            y([0, m // 2])
            continue
        print("No")
        continue
    if k == 4:
        if m % 4 == 0:
            y([0, m // 4, m // 2, 3 * m // 4])
            continue
        print("No")
        continue
    if k % 2 == 1:
        y([i for i in range((k + 1) // 2)])
        continue
    a = [i + 1 for i in range(k // 2)]
    a[0] = 0
    y(a)

posted:
last update: