D - Polynomial division Editorial by MMNMM

実装が比較的容易な解法

十分大きな整数 \(X\) に対して \(A(X)\) および \(C(X)\) を求めることで \(B(X)\) を求めることができます。

ここで、\(B(X) \bmod X\) は \(b_0 \bmod X\) と等しいです。\(X>200\) とすることで、 \[b_0 = \begin{cases}b_0 \bmod X\qquad\quad(b_0\bmod X\leq100)\\ b_0\bmod X-X\qquad\quad(\text{otherwise.})\end{cases}\] のように \(b_0\) を確定させることができます。

\(\dfrac{B(X)-b_0}{X}\) に対して同様の計算を行うことで \(b_1\) を求めることができ、これを繰り返すことですべての \(b_i\) を求めることができました。

\(X>200\) より、\(A(X),B(X),C(X)\) は大きいと \(\displaystyle 100\times\sum_{i=0}^{200}201^i>10^{462}\) 程度になることがあることに気をつけてください。

python で実装すると以下のようになります。\(X=256\) としています。(実際の提出)

N, M = map(int, input().split())

X = 256

A = 0
Xⁿ = 1
for a in map(int, input().split()):
    A += a * Xⁿ
    Xⁿ *= X

C = 0
Xⁿ = 1
for c in map(int, input().split()):
    C += c * Xⁿ
    Xⁿ *= X

B = C // A
b = []
while B != 0:
    x = B % X
    if x > 100:
        x -= X
    b.append(x)
    B = (B - x) // X

print(*b)

posted:
last update: