結果
問題 | No.3041 非対称じゃんけん |
ユーザー |
![]() |
提出日時 | 2025-02-28 22:16:02 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 5,045 bytes |
コンパイル時間 | 295 ms |
コンパイル使用メモリ | 82,316 KB |
実行使用メモリ | 196,140 KB |
最終ジャッジ日時 | 2025-02-28 22:16:19 |
合計ジャッジ時間 | 13,787 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 TLE * 3 -- * 9 |
ソースコード
mod=998244353MOD=modclass Convolution:def __init__(self):# self.mod = modself.g = self.primitive_root(MOD)self.first_butterfly = Trueself.first_butterfly_inv = Trueself.sum_e = [0] * 30self.sum_ie = [0] * 30# 原始根の取得def primitive_root(self, m: int):if (m == 2):return 1if (m == 167772161):return 3if (m == 469762049):return 3if (m == 754974721):return 11if (m == 998244353):return 3divs = [0] * 20divs[0] = 2cnt = 1x = (m-1)//2while(x % 2 == 0):x //= 2for i in range(3, x+1, 2):if(i**2 > x):breakif(x % i == 0):divs[cnt] = icnt += 1while(x % i == 0):x //= iif(x > 1):divs[cnt] = xcnt += 1g = 2while(True):ok = Truefor i in range(cnt):if(pow(g, (m-1)//divs[i], m) == 1):ok = Falsebreakif(ok):return gg += 1print('error')return 0def butterfly(self, a: list):# MOD = self.modn = len(a)h = (n-1).bit_length()if(self.first_butterfly):self.first_butterfly = Falsees = [0] * 30ies = [0] * 30mod_m = MOD-1cnt2 = (mod_m & -mod_m).bit_length() - 1e = pow(self.g, mod_m >> cnt2, MOD)ie = pow(e, MOD-2, MOD)for i in range(cnt2-2, -1, -1):es[i] = eies[i] = iee *= ee %= MODie *= ieie %= MODnow = 1for i in range(cnt2-1):self.sum_e[i] = (es[i] * now) % MODnow *= ies[i]now %= MODfor ph in range(1, h+1):w = 1 << (ph-1)p = 1 << (h-ph)now = 1for s in range(w):offset = s << (h-ph+1)for i in range(p):l = a[i + offset]r = a[i + offset + p] * nowa[i + offset] = (l+r) % MODa[i + offset + p] = (l-r) % MODnow *= self.sum_e[(~s & -~s).bit_length() - 1]now %= MODdef butterfly_inv(self, a: list):# MOD = self.modn = len(a)h = (n-1).bit_length()if(self.first_butterfly_inv):self.first_butterfly_inv = Falsees = [0] * 30ies = [0] * 30mod_m = MOD-1cnt2 = (mod_m & -mod_m).bit_length() - 1e = pow(self.g, mod_m >> cnt2, MOD)ie = pow(e, MOD-2, MOD)for i in range(cnt2-2, -1, -1):es[i] = eies[i] = iee *= ee %= MODie *= ieie %= MODnow = 1for i in range(cnt2-1):self.sum_ie[i] = (ies[i] * now) % MODnow *= es[i]now %= MODfor ph in range(h, 0, -1):w = 1 << (ph-1)p = 1 << (h-ph)inow = 1for 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) % MODa[i + offset + p] = ((l - r) * inow) % MODinow *= self.sum_ie[(~s & -~s).bit_length() - 1]inow %= MODdef convolution(self, a: list, b: list):# MOD = self.modn = len(a)m = len(b)if(n == 0) | (m == 0):return []if(min(n, m) <= 60):if(n < m):a, b = b, an, m = m, nans = [0] * (n+m-1)for i in range(n):for j in range(m):ans[i+j] += a[i] * b[j]ans[i+j] %= MODreturn ansz = 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] %= MODself.butterfly_inv(a)a = a[:(n+m-1)]iz = pow(z, MOD-2, MOD)for i in range(n+m-1):a[i] *= iza[i] %= MODreturn aN,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]+=1cnv=Convolution()D=cnv.convolution(D,E)ans=0for d in D:if d!=0:ans+=1print(ans)