結果

問題 No.3041 非対称じゃんけん
ユーザー timi
提出日時 2025-02-28 22:36:59
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 5,070 bytes
コンパイル時間 357 ms
コンパイル使用メモリ 82,884 KB
実行使用メモリ 197,768 KB
最終ジャッジ日時 2025-02-28 22:37:17
合計ジャッジ時間 17,584 ms
ジャッジサーバーID
(参考情報)
judge6 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 18 TLE * 3 -- * 9
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

mod=998244353
MOD=mod
class Convolution:
def __init__(self):
# self.mod = mod
self.g = self.primitive_root(MOD)
self.first_butterfly = True
self.first_butterfly_inv = True
self.sum_e = [0] * 30
self.sum_ie = [0] * 30
#
def primitive_root(self, m: int):
if (m == 2):
return 1
if (m == 167772161):
return 3
if (m == 469762049):
return 3
if (m == 754974721):
return 11
if (m == 998244353):
return 3
divs = [0] * 20
divs[0] = 2
cnt = 1
x = (m-1)//2
while(x % 2 == 0):
x //= 2
for i in range(3, x+1, 2):
if(i**2 > x):
break
if(x % i == 0):
divs[cnt] = i
cnt += 1
while(x % i == 0):
x //= i
if(x > 1):
divs[cnt] = x
cnt += 1
g = 2
while(True):
ok = True
for i in range(cnt):
if(pow(g, (m-1)//divs[i], m) == 1):
ok = False
break
if(ok):
return g
g += 1
print('error')
return 0
def butterfly(self, a: list):
# MOD = self.mod
n = len(a)
h = (n-1).bit_length()
if(self.first_butterfly):
self.first_butterfly = False
es = [0] * 30
ies = [0] * 30
mod_m = MOD-1
cnt2 = (mod_m & -mod_m).bit_length() - 1
e = pow(self.g, mod_m >> cnt2, MOD)
ie = pow(e, MOD-2, MOD)
for i in range(cnt2-2, -1, -1):
es[i] = e
ies[i] = ie
e *= e
e %= MOD
ie *= ie
ie %= MOD
now = 1
for i in range(cnt2-1):
self.sum_e[i] = (es[i] * now) % MOD
now *= ies[i]
now %= MOD
for ph in range(1, h+1):
w = 1 << (ph-1)
p = 1 << (h-ph)
now = 1
for s in range(w):
offset = s << (h-ph+1)
for i in range(p):
l = a[i + offset]
r = a[i + offset + p] * now
a[i + offset] = (l+r) % MOD
a[i + offset + p] = (l-r) % MOD
now *= self.sum_e[(~s & -~s).bit_length() - 1]
now %= MOD
def butterfly_inv(self, a: list):
# MOD = self.mod
n = len(a)
h = (n-1).bit_length()
if(self.first_butterfly_inv):
self.first_butterfly_inv = False
es = [0] * 30
ies = [0] * 30
mod_m = MOD-1
cnt2 = (mod_m & -mod_m).bit_length() - 1
e = pow(self.g, mod_m >> cnt2, MOD)
ie = pow(e, MOD-2, MOD)
for i in range(cnt2-2, -1, -1):
es[i] = e
ies[i] = ie
e *= e
e %= MOD
ie *= ie
ie %= MOD
now = 1
for i in range(cnt2-1):
self.sum_ie[i] = (ies[i] * now) % MOD
now *= es[i]
now %= MOD
for ph in range(h, 0, -1):
w = 1 << (ph-1)
p = 1 << (h-ph)
inow = 1
for s in range(w):
offset = s << (h-ph+1)
for i in range(p):
l = a[i + offset]
r = a[i + offset + p]
a[i + offset] = (l+r) % MOD
a[i + offset + p] = ((l - r) * inow) % MOD
inow *= self.sum_ie[(~s & -~s).bit_length() - 1]
inow %= MOD
def convolution(self, a: list, b: list):
# MOD = self.mod
n = len(a)
m = len(b)
if(n == 0) | (m == 0):
return []
if(min(n, m) <= 60):
if(n < m):
a, b = b, a
n, m = m, n
ans = [0] * (n+m-1)
for i in range(n):
for j in range(m):
ans[i+j] += a[i] * b[j]
ans[i+j] %= MOD
return ans
z = 1 << (n+m-2).bit_length()
a += [0] * (z-n)
b += [0] * (z-m)
self.butterfly(a)
self.butterfly(b)
for i in range(z):
a[i] *= b[i]
a[i] %= MOD
self.butterfly_inv(a)
a = a[:(n+m-1)]
iz = pow(z, MOD-2, MOD)
for i in range(n+m-1):
a[i] *= iz
a[i] %= MOD
return a
N,M=map(int, input().split())
A=list(map(int, input().split()))
B=list(map(int, input().split()))
C=list(map(int, input().split()))
D=[1]
for i in range(N):
a,b,c=A[i],B[i],C[i]
E=[0]*max(a+1,b+1,c+1)
E[a]=1;E[b]=1;E[c]=1
cnv=Convolution()
D=cnv.convolution(D,E)
ans=0
for i in range(len(D)):
if D[i]!=0:
ans+=1
D[i]=1
print(ans)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0