結果
問題 |
No.1067 #いろいろな色 / Red and Blue and more various colors (Middle)
|
ユーザー |
![]() |
提出日時 | 2025-04-24 12:32:40 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,608 bytes |
コンパイル時間 | 356 ms |
コンパイル使用メモリ | 82,532 KB |
実行使用メモリ | 360,196 KB |
最終ジャッジ日時 | 2025-04-24 12:34:00 |
合計ジャッジ時間 | 6,440 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 24 WA * 1 |
ソースコード
MOD = 998244353 def main(): import sys input = sys.stdin.read data = input().split() ptr = 0 N = int(data[ptr]) ptr += 1 Q = int(data[ptr]) ptr += 1 A = list(map(int, data[ptr:ptr+N])) ptr += N A.sort() # Compute prefix products (0-based) prefix = [1] * (N + 1) for i in range(1, N + 1): prefix[i] = (prefix[i-1] * (A[i-1] % MOD)) % MOD # Compute suffix products (1-based) suffix = [1] * (N + 2) for i in range(N, 0, -1): term = (A[i-1] - 1) % MOD suffix[i] = (term * suffix[i+1]) % MOD # Compute x_i (modular inverses) x = [0] * (N + 2) # x[1..N] for i in range(1, N + 1): a = A[i-1] term = (a - 1) % MOD if term == 0: x[i] = 0 else: x[i] = pow(term, MOD-2, MOD) # Precompute dp table (1-based) dp = [[0] * (N + 2) for _ in range(N + 2)] for k in range(N, 0, -1): max_p = N - k + 1 dp[k][0] = 1 for p in range(1, max_p + 1): if k == N: dp[k][p] = x[k] if p == 1 else 0 else: dp[k][p] = (dp[k+1][p] + x[k] * dp[k+1][p-1]) % MOD # Process queries output = [] for _ in range(Q): l = int(data[ptr]) ptr += 1 r = int(data[ptr]) ptr += 1 p = int(data[ptr]) ptr += 1 xor_result = 0 for c in range(l, r + 1): # Binary search for the first index >= c (0-based) low, high = 0, N - 1 k = N # if all elements are < c, then k = N (0-based) while low <= high: mid = (low + high) // 2 if A[mid] >= c: k = mid high = mid - 1 else: low = mid + 1 # k is 0-based index of first element >= c m = N - k if m < p: fc = 0 else: product_active = suffix[k + 1] # convert to 1-based if product_active == 0: fc = 0 else: product_non_active = prefix[k] if p > (m): s_p = 0 else: s_p = dp[k + 1][p] # k+1 is 1-based fc = (product_non_active * product_active) % MOD fc = (fc * s_p) % MOD xor_result ^= fc output.append(xor_result % MOD) print('\n'.join(map(str, output))) if __name__ == "__main__": main()