結果
問題 |
No.1958 Bit Game
|
ユーザー |
![]() |
提出日時 | 2025-03-20 20:20:36 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 287 ms / 2,000 ms |
コード長 | 1,513 bytes |
コンパイル時間 | 408 ms |
コンパイル使用メモリ | 82,104 KB |
実行使用メモリ | 158,236 KB |
最終ジャッジ日時 | 2025-03-20 20:21:39 |
合計ジャッジ時間 | 9,156 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
MOD = 998244353 def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) idx +=1 X = int(data[idx]) idx +=1 Y = int(data[idx]) idx +=1 A = list(map(int, data[idx:idx+X])) idx += X B = list(map(int, data[idx:idx+Y])) idx += Y # Precompute counts for each bit in A and B bits = 18 cntA = [0]*bits cntB = [0]*bits for a in A: for k in range(bits): if (a >> k) & 1: cntA[k] += 1 for b in B: for k in range(bits): if (b >> k) & 1: cntB[k] += 1 invX = pow(X, MOD-2, MOD) invY = pow(Y, MOD-2, MOD) pow_XY = (X % MOD) * (Y % MOD) % MOD pow_XY_N = pow(pow_XY, N, MOD) sum_terms = 0 for k in range(bits): ca = cntA[k] cb = cntB[k] pA = (ca * invX) % MOD pB = (cb * invY) % MOD part = (1 - pA) % MOD D = (pB * part) % MOD denominator = (1 - D) % MOD if denominator != 0: x_num = (pA * pB) % MOD x = x_num * pow(denominator, MOD-2, MOD) % MOD Dn = pow(D, N, MOD) term = (x * (1 - Dn)) % MOD else: term = (N % MOD) * ((pA * pB) % MOD) % MOD pow2k = pow(2, k, MOD) term_total = (term * pow2k) % MOD sum_terms = (sum_terms + term_total) % MOD answer = (sum_terms * pow_XY_N) % MOD print(answer) if __name__ == "__main__": main()