結果
問題 | No.1145 Sums of Powers |
ユーザー |
![]() |
提出日時 | 2024-06-10 20:48:24 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,305 ms / 2,000 ms |
コード長 | 5,667 bytes |
コンパイル時間 | 1,001 ms |
コンパイル使用メモリ | 82,512 KB |
実行使用メモリ | 138,000 KB |
最終ジャッジ日時 | 2025-01-02 18:24:08 |
合計ジャッジ時間 | 6,104 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 6 |
ソースコード
mod = 998244353imag = 911660635iimag = 86583718rate2 = (0, 911660635, 509520358, 369330050, 332049552, 983190778, 123842337, 238493703, 975955924, 603855026, 856644456, 131300601, 842657263,730768835, 942482514, 806263778, 151565301, 510815449, 503497456, 743006876, 741047443, 56250497, 867605899, 0)irate2 = (0, 86583718, 372528824, 373294451, 645684063, 112220581, 692852209, 155456985, 797128860, 90816748, 860285882, 927414960, 354738543,109331171, 293255632, 535113200, 308540755, 121186627, 608385704, 438932459, 359477183, 824071951, 103369235, 0)rate3 = (0, 372528824, 337190230, 454590761, 816400692, 578227951, 180142363, 83780245, 6597683, 70046822, 623238099, 183021267, 402682409, 631680428, 344509872, 689220186, 365017329, 774342554, 729444058, 102986190, 128751033, 395565204, 0)irate3 = (0, 509520358, 929031873, 170256584, 839780419, 282974284, 395914482, 444904435, 72135471, 638914820, 66769500, 771127074, 985925487,262319669, 262341272, 625870173, 768022760, 859816005, 914661783, 430819711, 272774365, 530924681, 0)def fft(a):n = len(a)h = (n - 1).bit_length()le = 0while le < h:if h == le + 1:p = 1rot = 1for s in range(1 << le):offset = s << (h - le)for i in range(p):l = a[i + offset]r = a[i + offset + p] * rota[i + offset] = (l + r) % moda[i + offset + p] = (l - r) % modrot *= rate2[(~s & -~s).bit_length()]rot %= modle += 1else:p = 1 << (h - le - 2)rot = 1for s in range(1 << le):rot2 = rot * rot % modrot3 = rot2 * rot % modoffset = s << (h - le)for i in range(p):a0 = a[i + offset]a1 = a[i + offset + p] * rota2 = a[i + offset + p * 2] * rot2a3 = a[i + offset + p * 3] * rot3a1na3imag = (a1 - a3) % mod * imaga[i + offset] = (a0 + a2 + a1 + a3) % moda[i + offset + p] = (a0 + a2 - a1 - a3) % moda[i + offset + p * 2] = (a0 - a2 + a1na3imag) % moda[i + offset + p * 3] = (a0 - a2 - a1na3imag) % modrot *= rate3[(~s & -~s).bit_length()]rot %= modle += 2def fft_inv(a):n = len(a)h = (n - 1).bit_length()le = hwhile le:if le == 1:p = 1 << (h - le)irot = 1for s in range(1 << (le - 1)):offset = s << (h - le + 1)for i in range(p):l = a[i + offset]r = a[i + offset + p]a[i + offset] = (l + r) % moda[i + offset + p] = (l - r) * irot % modirot *= irate2[(~s & -~s).bit_length()]irot %= modle -= 1else:p = 1 << (h - le)irot = 1for s in range(1 << (le - 2)):irot2 = irot * irot % modirot3 = irot2 * irot % modoffset = s << (h - le + 2)for i in range(p):a0 = a[i + offset]a1 = a[i + offset + p]a2 = a[i + offset + p * 2]a3 = a[i + offset + p * 3]a2na3iimag = (a2 - a3) * iimag % moda[i + offset] = (a0 + a1 + a2 + a3) % moda[i + offset + p] = (a0 - a1 + a2na3iimag) * irot % moda[i + offset + p * 2] = (a0 + a1 - a2 - a3) * irot2 % moda[i + offset + p * 3] = (a0 - a1 - a2na3iimag) * irot3 % modirot *= irate3[(~s & -~s).bit_length()]irot %= modle -= 2def ntt(a):if len(a) <= 1:returnfft(a)def ntt_inv(a):if len(a) <= 1:returnfft_inv(a)iv = pow(len(a),mod-2,mod)for i in range(len(a)):a[i] = a[i] * iv % moddef convolute(s, t):a = s[:]b = t[:]n = len(a)m = len(b)z = 1 << (n + m - 2).bit_length()a += [0] * (z - n)b += [0] * (z - m)fft(a)fft(b)for i in range(z):a[i] *= b[i]a[i] %= modfft_inv(a)a = a[:n + m - 1]iz = pow(z, mod - 2, mod)for i in range(n+m-1):a[i] = (a[i] * iz) % modreturn adef fps_inv(a,deg = -1):if deg == -1:deg = len(a)res = [0] * degres[0] = pow(a[0],mod-2,mod)d = 1while d < deg:f = [0] * (d << 1)tmp = min(len(a),d << 1)f[:tmp] = a[:tmp]g = [0] * (d << 1)g[:d] = res[:d]ntt(f)ntt(g)for i in range(d << 1):f[i] = f[i] * g[i] % modntt_inv(f)f[:d] = [0] * dntt(f)for i in range(d << 1):f[i] = f[i] * g[i] % modntt_inv(f)for j in range(d,min(d << 1,deg)):if f[j]:res[j] = mod - f[j]else:res[j] = 0d <<= 1return resdef fps_div(f,g):n,m = len(f),len(g)if n < m:return [],frev_f = f[:]rev_f = rev_f[::-1]rev_g = g[:]rev_g = rev_g[::-1]rev_q = convolute(rev_f,fps_inv(rev_g,n-m+1))[:n-m+1]q = rev_q[:]q = q[::-1]p = convolute(g,q)r = f[:]for i in range(min(len(p),len(r))):r[i] -= p[i]r[i] %= modwhile len(r):if r[-1] != 0:breakr.pop()return q,rdef fps_diff(a):res = []for i in range(1,len(a)):res.append(i * a[i] % mod)return resdef fps_integrate(a):n = len(a)res = [0] * (n + 1)for i in range(n):res[i+1] = pow(i + 1,mod-2,mod) * a[i] % modreturn resdef fps_log(a,deg = -1):if deg == -1:deg = len(a)res = convolute(fps_diff(a),fps_inv(a,deg))res = fps_integrate(res)return res[:deg]from collections import dequeN,M = map(int,input().split())A = list(map(int,input().split()))F = deque([[1,-A[i]] for i in range(N)])while len(F) > 1:f = F.popleft()g = F.popleft()h = convolute(f,g)F.append(h)F = F[0]F = fps_log(F,M+1)F = fps_diff(F)for i in range(len(F)):F[i] = (mod - F[i]) % modprint(*F)