結果
問題 | No.1068 #いろいろな色 / Red and Blue and more various colors (Hard) |
ユーザー | shotoyoo |
提出日時 | 2021-07-11 21:19:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 2,556 ms / 3,500 ms |
コード長 | 2,856 bytes |
コンパイル時間 | 311 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 265,572 KB |
最終ジャッジ日時 | 2024-07-02 03:16:47 |
合計ジャッジ時間 | 49,147 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 47 ms
54,400 KB |
testcase_01 | AC | 48 ms
54,272 KB |
testcase_02 | AC | 47 ms
54,016 KB |
testcase_03 | AC | 158 ms
78,976 KB |
testcase_04 | AC | 150 ms
78,720 KB |
testcase_05 | AC | 152 ms
78,848 KB |
testcase_06 | AC | 146 ms
78,592 KB |
testcase_07 | AC | 141 ms
78,208 KB |
testcase_08 | AC | 149 ms
78,976 KB |
testcase_09 | AC | 153 ms
78,976 KB |
testcase_10 | AC | 139 ms
78,336 KB |
testcase_11 | AC | 141 ms
78,336 KB |
testcase_12 | AC | 135 ms
78,080 KB |
testcase_13 | AC | 2,528 ms
265,184 KB |
testcase_14 | AC | 2,496 ms
265,436 KB |
testcase_15 | AC | 2,508 ms
265,308 KB |
testcase_16 | AC | 2,506 ms
265,448 KB |
testcase_17 | AC | 2,506 ms
265,180 KB |
testcase_18 | AC | 2,493 ms
265,196 KB |
testcase_19 | AC | 2,498 ms
265,068 KB |
testcase_20 | AC | 2,491 ms
265,448 KB |
testcase_21 | AC | 2,484 ms
265,572 KB |
testcase_22 | AC | 2,499 ms
265,080 KB |
testcase_23 | AC | 2,502 ms
265,436 KB |
testcase_24 | AC | 2,556 ms
265,312 KB |
testcase_25 | AC | 2,491 ms
265,300 KB |
testcase_26 | AC | 2,485 ms
265,176 KB |
testcase_27 | AC | 2,500 ms
265,452 KB |
testcase_28 | AC | 2,506 ms
264,776 KB |
testcase_29 | AC | 2,483 ms
265,104 KB |
testcase_30 | AC | 2,499 ms
264,972 KB |
testcase_31 | AC | 47 ms
53,888 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] def conv_all(l): from collections import deque q = deque(l) while len(q)>=2: a = q.popleft() b = q.popleft() q.append(conv(a,b)) return q[0] 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] c = conv_all(h) ans = [c[i]%M for i in b] write("\n".join(map(str, ans)))