結果
| 問題 | No.3101 Range Eratosthenes Query |
| コンテスト | |
| ユーザー |
tnakao0123
|
| 提出日時 | 2025-04-14 11:36:48 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,396 bytes |
| コンパイル時間 | 668 ms |
| コンパイル使用メモリ | 45,052 KB |
| 実行使用メモリ | 10,412 KB |
| 最終ジャッジ日時 | 2025-04-14 11:37:19 |
| 合計ジャッジ時間 | 30,687 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 18 TLE * 5 -- * 1 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:48:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
48 | scanf("%d", &tn);
| ~~~~~^~~~~~~~~~~
main.cpp:52:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
52 | scanf("%d%d", &l, &r), r++;
| ~~~~~^~~~~~~~~~~~~~~~
ソースコード
/* -*- coding: utf-8 -*-
*
* 3101.cc: No.3101 Range Eratosthenes Query - yukicoder
*/
#include<cstdio>
#include<algorithm>
using namespace std;
/* constant */
const int N = 1000000;
const int D = 1000;
const int M = N / D;
/* typedef */
/* global variables */
bool primes[N + 1];
int xds[N + 1], gds[M][D];
/* subroutines */
/* main */
int main() {
fill(primes, primes + N + 1, true);
primes[0] = primes[1] = false;
fill(xds, xds + N + 1, 1);
xds[0] = xds[1] = 0;
for (int p = 2; p * p <= N; p++)
if (primes[p]) {
for (int q = p * 2; q <= N; q += p) {
primes[q] = false;
xds[q] = max(xds[q], q / p);
}
}
for (int q = 1; q < M; q++) {
for (int d = 0; d < D; d++) gds[q][d] = xds[q * D + d];
sort(gds[q], gds[q] + D);
}
int tn;
scanf("%d", &tn);
while (tn--) {
int l, r;
scanf("%d%d", &l, &r), r++;
if (l == 1) { puts("1"); continue; }
int lq = l / D, ld = l % D, rq = r / D, rd = r % D;
int sum = 0;
if (lq == rq) {
for (int d = ld; d < rd; d++)
if (xds[lq * D + d] < l) sum++;
}
else {
for (int d = ld; d < D; d++)
if (xds[lq * D + d] < l) sum++;
for (lq++; lq < rq; lq++) {
int k = lower_bound(gds[lq], gds[lq] + D, l) - gds[lq];
sum += k;
}
for (int d = 0; d < rd; d++)
if (xds[rq * D + d] < l) sum++;
}
printf("%d\n", sum);
}
return 0;
}
tnakao0123