結果
問題 |
No.3101 Range Eratosthenes Query
|
ユーザー |
![]() |
提出日時 | 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; }