結果
問題 | No.1068 #いろいろな色 / Red and Blue and more various colors (Hard) |
ユーザー | shotoyoo |
提出日時 | 2021-07-11 21:11:48 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 2,895 ms / 3,500 ms |
コード長 | 2,850 bytes |
コンパイル時間 | 173 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 265,272 KB |
最終ジャッジ日時 | 2024-07-02 03:15:57 |
合計ジャッジ時間 | 56,766 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 43 ms
52,736 KB |
testcase_01 | AC | 46 ms
52,992 KB |
testcase_02 | AC | 43 ms
52,736 KB |
testcase_03 | AC | 211 ms
80,128 KB |
testcase_04 | AC | 197 ms
78,976 KB |
testcase_05 | AC | 202 ms
78,976 KB |
testcase_06 | AC | 196 ms
78,848 KB |
testcase_07 | AC | 194 ms
79,360 KB |
testcase_08 | AC | 203 ms
79,488 KB |
testcase_09 | AC | 208 ms
80,256 KB |
testcase_10 | AC | 156 ms
78,208 KB |
testcase_11 | AC | 194 ms
79,104 KB |
testcase_12 | AC | 156 ms
78,208 KB |
testcase_13 | AC | 2,875 ms
264,160 KB |
testcase_14 | AC | 2,855 ms
264,028 KB |
testcase_15 | AC | 2,879 ms
264,276 KB |
testcase_16 | AC | 2,864 ms
264,032 KB |
testcase_17 | AC | 2,871 ms
264,032 KB |
testcase_18 | AC | 2,863 ms
264,412 KB |
testcase_19 | AC | 2,872 ms
264,416 KB |
testcase_20 | AC | 2,873 ms
264,156 KB |
testcase_21 | AC | 2,872 ms
264,032 KB |
testcase_22 | AC | 2,868 ms
264,008 KB |
testcase_23 | AC | 2,854 ms
264,540 KB |
testcase_24 | AC | 2,859 ms
264,292 KB |
testcase_25 | AC | 2,858 ms
264,548 KB |
testcase_26 | AC | 2,869 ms
264,540 KB |
testcase_27 | AC | 2,869 ms
264,152 KB |
testcase_28 | AC | 2,895 ms
265,272 KB |
testcase_29 | AC | 2,847 ms
263,700 KB |
testcase_30 | AC | 2,826 ms
263,824 KB |
testcase_31 | AC | 42 ms
52,480 KB |
ソースコード
import sys input = lambda : sys.stdin.readline().rstrip() sys.setrecursionlimit(2*10**5+10) write = lambda x: sys.stdout.write(x+"\n") debug = lambda x: sys.stderr.write(x+"\n") writef = lambda x: print("{:.12f}".format(x)) n,q = list(map(int, input().split())) a = list(map(int, input().split())) b = list(map(int, input().split())) M = 998244353 a = [v%M for v in a] # NTT def factor(n, m=None): # mを与えると、高々その素因数まで見て、残りは分解せずにそのまま出力する f = {} tmp = n M = int(-(-n**0.5//1))+1 if m is not None: M = min(m+1, M) for i in range(2, M+1): if tmp<i: break if tmp%i==0: cnt=0 while tmp%i==0: cnt+=1 tmp //= i f[i] = cnt if tmp!=1: f[tmp] = 1 if not f: f[n] = 1 return f def primitive_root(p): if p == 2: return 1 if p == 167772161: return 3 if p == 469762049: return 3 if p == 754974721: return 11 if p == 998244353: return 3 g = 2 f = factor(p-1) while True: if all(pow(g,(p-1)//k,p)!=1 for k in f.keys()): break g += 1 return g # 順番は変わる def ntt(A,n): for i in range(n): m = 1 << (n-i-1) for start in range(1 << i): w = 1 start *= m*2 for j in range(m): A[start+j],A[start+j+m] = (A[start+j]+A[start+j+m]) % M,(A[start+j]-A[start+j+m])*w % M w *= roots[n-i] w %= M return A def inv_ntt(A,n): for i in range(n): m = 1 << i for start in range(1 << (n-i-1)): w = 1 start *= m*2 for j in range(m): A[start+j],A[start+j+m] = (A[start+j]+A[start+j+m]*w) % M,(A[start+j]-A[start+j+m]*w) % M w *= inv_roots[i+1] w %= M a = pow(2,n*(M-2),M) for i in range(1 << n): A[i] *= a A[i] %= M return A def conv(A,B): a,b = len(A),len(B) deg = a+b-2 n = deg.bit_length() N = 1 << n A += [0]*(N-a) # A の次数を 2冪-1 にする B += [0]*(N-b) # B の次数を 2冪-1 にする A = ntt(A,n) B = ntt(B,n) C = [(A[i]*B[i]) % M for i in range(N)] C = inv_ntt(C,n) return C[:deg+1] pr = primitive_root(M) roots = [pow(pr,(M-1) >> i,M) for i in range(24)] inv_roots = [pow(r,M-2,M) for r in roots] # roots[i] = 1 の 2**i 乗根、inv_roots[i] = 1 の 2**i 乗根の逆元 h = [[v-1,1] for v in a] while len(h)>=2: nh = [] if len(h)%2==0: pass else: nh.append(h.pop()) for i in range(0, len(h), 2): nh.append(conv(h[i], h[i+1])) h = nh c = h[0] ans = [c[i]%M for i in b] write("\n".join(map(str, ans)))