結果
問題 |
No.1891 Static Xor Range Composite Query
|
ユーザー |
![]() |
提出日時 | 2025-06-12 20:20:09 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 1,911 bytes |
コンパイル時間 | 370 ms |
コンパイル使用メモリ | 82,544 KB |
実行使用メモリ | 602,880 KB |
最終ジャッジ日時 | 2025-06-12 20:20:33 |
合計ジャッジ時間 | 9,905 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 20 MLE * 1 -- * 9 |
ソースコード
import sys MOD = 998244353 def main(): input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) idx +=1 Q = int(data[idx]) idx +=1 a = [] b = [] for _ in range(N): ai = int(data[idx]) idx +=1 bi = int(data[idx]) idx +=1 a.append(ai % MOD) b.append(bi % MOD) max_level = 0 while (1 << max_level) <= N: max_level +=1 max_level -=1 logn = max_level blocks = [ [ [0,0] for _ in range(N) ] for __ in range(logn+1) ] for i in range(N): blocks[0][i] = (a[i], b[i]) for level in range(1, logn+1): d = 1 << level for s in range(0, N, d): left_s = s left_d = d // 2 right_s = s + left_d right_d = d // 2 a_left, b_left = blocks[level-1][left_s] a_right, b_right = blocks[level-1][right_s] a_total = (a_left * a_right) % MOD b_total = (b_left * a_right % MOD + b_right) % MOD blocks[level][s] = (a_total, b_total) def get_block(level, s): if s + (1 << level) > N: return (1, 0) a_total, b_total = blocks[level][s] return (a_total, b_total) for _ in range(Q): l = int(data[idx]) idx +=1 r = int(data[idx]) idx +=1 p = int(data[idx]) idx +=1 x = int(data[idx]) idx +=1 if l >= r: print(x % MOD) continue A_total = 1 B_total = 0 for i in range(l, r): k = i ^ p if k <0 or k >= N: A = 1 B = 0 else: A = a[k] B = b[k] A_total = (A_total * A) % MOD B_total = (B_total * A + B) % MOD res = (A_total * x + B_total) % MOD print(res) main()