結果
| 問題 |
No.2272 多項式乗算 mod 258280327
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 13:07:09 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,833 bytes |
| コンパイル時間 | 290 ms |
| コンパイル使用メモリ | 82,700 KB |
| 実行使用メモリ | 218,496 KB |
| 最終ジャッジ日時 | 2025-06-12 13:11:32 |
| 合計ジャッジ時間 | 8,682 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 WA * 3 TLE * 1 -- * 3 |
ソースコード
import sys
MOD = 258280327
def main():
input = sys.stdin.read().split()
ptr = 0
N = int(input[ptr])
ptr += 1
F = list(map(lambda x: int(x) % MOD, input[ptr:ptr + N + 1]))
ptr += N + 1
M = int(input[ptr])
ptr += 1
G = list(map(lambda x: int(x) % MOD, input[ptr:ptr + M + 1]))
ptr += M + 1
def multiply(a, b):
len_a = len(a)
len_b = len(b)
if len_a == 0 or len_b == 0:
return []
max_len = max(len_a, len_b)
if max_len <= 100:
return naive_multiply(a, b)
mid = (max_len + 1) // 2
def split(poly, mid):
return poly[:mid], poly[mid:]
a_low, a_high = split(a, mid)
b_low, b_high = split(b, mid)
z0 = multiply(a_low, b_low)
z2 = multiply(a_high, b_high)
a_low_ext = a_low + [0] * (mid - len(a_low))
a_high_ext = a_high + [0] * (mid - len(a_high))
a_mid = [(a_low_ext[i] + a_high_ext[i]) % MOD for i in range(mid)]
b_low_ext = b_low + [0] * (mid - len(b_low))
b_high_ext = b_high + [0] * (mid - len(b_high))
b_mid = [(b_low_ext[i] + b_high_ext[i]) % MOD for i in range(mid)]
z1 = multiply(a_mid, b_mid)
z1 = sub_poly(sub_poly(z1, z0), z2)
result = [0] * (len_a + len_b - 1)
for i in range(len(z0)):
result[i] = (result[i] + z0[i]) % MOD
for i in range(len(z1)):
if mid + i < len(result):
result[mid + i] = (result[mid + i] + z1[i]) % MOD
else:
result.append(z1[i] % MOD)
for i in range(len(z2)):
if 2 * mid + i < len(result):
result[2 * mid + i] = (result[2 * mid + i] + z2[i]) % MOD
else:
result.append(z2[i] % MOD)
return result
def naive_multiply(a, b):
res = [0] * (len(a) + len(b) - 1)
for i in range(len(a)):
if a[i] == 0:
continue
for j in range(len(b)):
if b[j] == 0:
continue
res[i + j] = (res[i + j] + a[i] * b[j]) % MOD
return res
def sub_poly(a, b):
len_a = len(a)
len_b = len(b)
res = a.copy()
for i in range(len_b):
if i < len_a:
res[i] = (res[i] - b[i]) % MOD
else:
res.append((-b[i]) % MOD)
while len(res) > 0 and res[-1] == 0:
res.pop()
return res
product = multiply(F, G)
L = len(product) - 1 if product else 0
while L > 0 and product[L] == 0:
L -= 1
product = product[:L + 1] if product else [0]
print(L)
if L == 0:
print(product[0] % MOD)
else:
print(' '.join(map(str, product)))
if __name__ == '__main__':
main()
gew1fw