結果
問題 |
No.1067 #いろいろな色 / Red and Blue and more various colors (Middle)
|
ユーザー |
![]() |
提出日時 | 2025-05-14 12:56:03 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,468 bytes |
コンパイル時間 | 442 ms |
コンパイル使用メモリ | 82,404 KB |
実行使用メモリ | 361,344 KB |
最終ジャッジ日時 | 2025-05-14 12:57:54 |
合計ジャッジ時間 | 8,529 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 24 WA * 1 |
ソースコード
import bisect MOD = 998244353 def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) Q = int(data[idx+1]) idx +=2 A = list(map(int, data[idx:idx+N])) idx +=N queries = [] for _ in range(Q): l = int(data[idx]) r = int(data[idx+1]) p = int(data[idx+2]) queries.append((l, r, p)) idx +=3 # Sort the array sorted_A = sorted(A) # Precompute prefix_prod and suffix_prod_minus_1 prefix_prod = [1] * (N + 1) for i in range(N): prefix_prod[i+1] = prefix_prod[i] * sorted_A[i] % MOD suffix_prod_minus_1 = [1] * (N + 1) for i in range(N-1, -1, -1): temp = sorted_A[i] - 1 if temp < 0: temp = 0 suffix_prod_minus_1[i] = suffix_prod_minus_1[i+1] * temp % MOD # Precompute x_i for each element in sorted_A x = [] for a in sorted_A: temp = a - 1 if temp <= 0: xi = 0 else: temp_mod = temp % MOD if temp_mod == 0: xi = 0 else: xi = pow(temp_mod, MOD-2, MOD) x.append(xi) # Precompute DP for elementary symmetric sums max_p = N dp = [[0] * (max_p + 1) for _ in range(N + 2)] # dp[i][p] for i in 0..N, p in 0..max_p dp[N][0] = 1 for i in range(N-1, -1, -1): dp[i][0] = 1 xi = x[i] for p in range(1, max_p + 1): dp[i][p] = (dp[i+1][p] + xi * dp[i+1][p-1]) % MOD # Process each query results = [] for l, r, p in queries: res = 0 for c in range(l, r+1): # Find the first index i where sorted_A[i] >= c i = bisect.bisect_left(sorted_A, c) m = N - i if m < p: cont = 0 else: # Compute product_not_S product_not_S = prefix_prod[i] # Compute product_S product_S = suffix_prod_minus_1[i] # Get e_p if p > max_p: e_p_val = 0 else: e_p_val = dp[i][p] # Compute contribution cont = product_not_S * product_S % MOD cont = cont * e_p_val % MOD res ^= cont results.append(res % MOD) print('\n'.join(map(str, results))) if __name__ == '__main__': main()