Official

A - Dot Product Editorial by sounansya


\(\displaystyle C_i=\frac{A_i}{B_i}\) とします。

もし \(C_1,C_2,\ldots,C_N\) の値が全て同じなら答えは No です。これは、 \(C=C_i>0\) とすると \(\displaystyle \sum_{i=1}^N A_iX_i=C\sum_{i=1}^N B_iX_i\) より \(\displaystyle \sum_{i=1}^N A_iX_i\)\(\displaystyle \sum_{i=1}^N B_iX_i\) の符号は常に同じになるからです。

逆に、\(C_1,C_2,\ldots,C_N\) の値が全て同じでないならば答えは Yes です。より詳細には、 \(C_i \neq C_j\) となる添字の組 \((i,j)\) を一つ取った際に以下のように構成することができます。

  • \(C_i < C_j\) なら \(X_i=-(A_j+B_j),\ X_j=A_i+B_i\) とし、これら以外の値は \(0\) にする。

  • \(C_i > C_j\) なら \(X_i=A_j+B_j,\ X_j=-(A_i+B_i)\) とし、これら以外の値は \(0\) にする。

証明

$C_i < C_j$ の場合を考えます。

$\displaystyle \sum_{k=1}^N A_kX_k = A_iX_i+A_jX_j=-A_i(A_j+B_j)+A_j(A_i+B_i)=A_jB_i-A_iB_j=B_iB_j\left(C_j-C_i \right)>0,$

$\displaystyle \sum_{k=1}^N B_kX_k = B_iX_i+B_jX_j=-B_i(A_j+B_j)+B_j(A_i+B_i)=A_iB_j-A_jB_i=B_iB_j\left(C_i-C_j \right)<0$

より従います。

$C_i > C_j$ の場合も同様に示すことができます。

以上を適切に実装することでこの問題に正答することができます。計算量は各テストケース毎に \(O(N)\) です。

実装例(Python3)

for _ in range(int(input())):
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    k = -1
    for i in range(1, n):
        if a[i] * b[0] != b[i] * a[0]:
            k = i
            break
    if k == -1:
        print("No")
        continue
    x = [0] * n
    x[0] = a[i] + b[i]
    x[i] = a[0] + b[0]
    if a[0] * b[i] > a[i] * b[0]:
        x[i] *= -1
    else:
        x[0] *= -1
    print("Yes")
    print(*x)

posted:
last update: