結果

問題 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++;
      |     ~~~~~^~~~~~~~~~~~~~~~

ソースコード

diff #

/* -*- 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;
}
0