結果
| 問題 |
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()