結果
問題 |
No.1349 Subset Product Queries
|
ユーザー |
|
提出日時 | 2025-06-28 17:26:17 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,176 ms / 2,000 ms |
コード長 | 1,131 bytes |
コンパイル時間 | 491 ms |
コンパイル使用メモリ | 82,904 KB |
実行使用メモリ | 137,796 KB |
最終ジャッジ日時 | 2025-06-28 17:26:39 |
合計ジャッジ時間 | 18,715 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 30 |
ソースコード
import sys def main(): data = sys.stdin.read().split() it = iter(data) n, q, P = map(int, (next(it), next(it), next(it))) A = [int(next(it)) % P for _ in range(n)] qs = [[] for _ in range(n)] ans = [''] * q for idx in range(q): L = int(next(it)) - 1 R = int(next(it)) - 1 K = int(next(it)) qs[R].append((idx, K, L)) # dp[r] = 用前缀能凑出乘积 ≡ r (mod P) 的子集时,这些子集的最小下标中的最大值 dp = [0] * P for i, a in enumerate(A, start=1): pre = dp[:] # 保留上一次的状态 # 用旧状态往前转移:选上一次能凑出 r 的子集,再乘上 a for r, pos in enumerate(pre): if pos: nr = (r * a) % P if dp[nr] < pos: dp[nr] = pos # 单独只选 A[i] 这一个 if dp[a] < i: dp[a] = i # 回答所有 R == i-1 的查询 for idx, K, L in qs[i-1]: ans[idx] = 'Yes' if dp[K] >= L+1 else 'No' sys.stdout.write('\n'.join(ans)) if __name__ == '__main__': main()