結果
問題 | No.3101 Range Eratosthenes Query |
ユーザー |
|
提出日時 | 2025-04-26 02:32:58 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,270 ms / 3,000 ms |
コード長 | 2,717 bytes |
コンパイル時間 | 429 ms |
コンパイル使用メモリ | 82,300 KB |
実行使用メモリ | 171,480 KB |
最終ジャッジ日時 | 2025-04-26 02:33:22 |
合計ジャッジ時間 | 22,934 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 24 |
ソースコード
## https://yukicoder.me/problems/no/3101 from collections import deque class BinaryIndexTree: """ フェニック木(BinaryIndexTree)の基本的な機能を実装したクラス """ def __init__(self, size): self.size = size self.array = [0] * (size + 1) def add(self, x, a): index = x while index <= self.size: self.array[index] += a index += index & (-index) def sum(self, x): index = x ans = 0 while index > 0: ans += self.array[index] index -= index & (-index) return ans def least_upper_bound(self, value): if self.sum(self.size) < value: return -1 elif value <= 0: return 0 m = 1 while m < self.size: m *= 2 k = 0 k_sum = 0 while m > 0: k0 = k + m if k0 < self.size: if k_sum + self.array[k0] < value: k_sum += self.array[k0] k += m m //= 2 if k < self.size: return k + 1 else: return -1 def main(): Q = int(input()) questions = [] max_r = 0 for _ in range(Q): L, R = map(int, input().split()) questions.append((L, R)) max_r = max(max_r, R) p_counts = [0] * (max_r + 1) for p in range(1, max_r + 1): if p_counts[p] > 0: continue x = 2 * p while x <= max_r: p_counts[x] += 1 x += p bit = BinaryIndexTree(max_r) for p in range(1, max_r + 1): if p_counts[p] == 0: bit.add(p, 1) l_map = {} for i in range(Q): l, r = questions[i] if l not in l_map: l_map[l] = [] l_map[l].append((i, r)) answers = [0] * Q queue = deque() for l in range(1, max_r + 1): while len(queue) > 0: p = queue.popleft() if p_counts[p] == 0: bit.add(p, 1) x = 2 * p while x <= max_r: p_counts[x] += 1 x += p if l in l_map: sss = bit.sum(l - 1) for index, r in l_map[l]: ans = bit.sum(r) - sss answers[index] = ans if p_counts[l] == 0: x = 2 * l while x <= max_r: p_counts[x] -= 1 if p_counts[x] == 0: queue.append(x) x += l for i in range(Q): print(answers[i]) if __name__ == "__main__": main()