結果
問題 | No.1618 Convolution? |
ユーザー |
👑 |
提出日時 | 2022-03-21 22:41:42 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,714 bytes |
コンパイル時間 | 284 ms |
コンパイル使用メモリ | 82,068 KB |
実行使用メモリ | 238,904 KB |
最終ジャッジ日時 | 2024-10-09 13:38:24 |
合計ジャッジ時間 | 4,819 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | TLE * 1 -- * 14 |
ソースコード
def f(A, B):def convolve(a, b, MOD=998244353):def primitive_root_constexpr():if MOD == 998244353:return 3elif MOD == 2:return 1elif MOD == 200003:return 2elif MOD == 167772161:return 3elif MOD == 469762049:return 3elif MOD == 754974721:return 11divs = [0] * 20divs[0] = 2cnt = 1x = (MOD - 1) // 2while x % 2 == 0:x //= 2i = 3while i * i <= x:if x % i == 0:divs[cnt] = icnt += 1while x % i == 0:x //= ii += 2if x > 1:divs[cnt] = xcnt += 1g = 2while 1:ok = Truefor i in range(cnt):if pow(g, (MOD - 1) // divs[i], MOD) == 1:ok = Falsebreakif ok:return gg += 1g = primitive_root_constexpr()ig = pow(g, MOD - 2, MOD)W = [pow(g, (MOD - 1) >> i, MOD) for i in range(30)]iW = [pow(ig, (MOD - 1) >> i, MOD) for i in range(30)]def fft(k, f):for l in range(k, 0, -1):d = 1 << l - 1U = [1]for i in range(d):U.append(U[-1] * W[l] % MOD)for i in range(1 << k - l):for j in range(d):s = i * 2 * d + jf[s], f[s+d] = (f[s] + f[s+d]) % MOD, U[j] * (f[s] - f[s+d]) % MODdef ifft(k, f):for l in range(1, k + 1):d = 1 << l - 1for i in range(1 << k - l):u = 1for j in range(i * 2 * d, (i * 2 + 1) * d):f[j+d] *= uf[j], f[j+d] = (f[j] + f[j+d]) % MOD, (f[j] - f[j+d]) % MODu = u * iW[l] % MODn0 = len(a) + len(b) - 1k = (n0).bit_length()n = 1 << ka = a + [0] * (n - len(a))b = b + [0] * (n - len(b))fft(k, a)fft(k, b)for i in range(n):a[i] = a[i] * b[i] % MODifft(k, a)invn = pow(n, MOD - 2, MOD)for i in range(n0):a[i] = a[i] * invn % MODdel a[n0:]return adef modinv(a, MOD):b = MODu = 1v = 0while b:t = a // ba -= t * bu -= t * va, b = b, au, v = v, uu %= MODif u < 0:u += mreturn udef Garner(M, R):m_prod = M[0]C = R[0]for m, r in zip(M[1:], R[1:]):t = (r - C) * modinv(m_prod, m) % mC += t * m_prodm_prod *= mreturn CMOD_ = [998244353, 167772161]n = len(A)lst = [[] for _ in range(2 * n - 1)]for mod in MOD_:C = convolve(A, B, mod)for i in range(2 * n - 1):lst[i].append(C[i])ans = [0] * (2 * n - 1)for i in range(2 * n - 1):ans[i] = Garner(MOD_, lst[i])return ansn = int(input())A = list(map(int, input().split()))B = list(map(int, input().split()))C = [i for i in range(1, n + 1)]D = f(A, C)E = f(B, C)ans = [0] + [d + e for d, e in zip(D, E)]print(*ans)