洛谷 P1865 A % B Problem

本文介绍了一种计算指定区间内质数数量的算法。通过筛选预处理一定范围内的质数,并利用前缀和技巧快速得出任意区间质数个数。文章提供了完整的实现代码及数据范围说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目背景

题目名称是吸引你点进来的

实际上该题还是很水的

题目描述

区间质数个数

输入输出格式

输入格式:
一行两个整数 询问次数n,范围m

接下来n行,每行两个整数 l,r 表示区间

输出格式:
对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line

输入输出样例

输入样例#1:
2 5
1 3
2 6
输出样例#1:
2
Crossing the line
说明

【数据范围和约定】

对于20%的数据 1<=n<=10 1<=m<=10

对于100%的数据 1<=n<=1000 1<=m<=1000000 -10^9<=l<=r<=10^9 1<=t<=1000000

第一眼看到是数论,又有mod,差点以为是个同余方程题(这个我只是渣渣),然后我看到了素数。

分析:筛一波素数,然后用f[n]表示1–n素数的个数,然后01出解。

代码:

var 
  z,x,i,j,n,m,w,h:longint;
  a:array[0..10000001]of longint;
begin
  readln(z,x);
  for i:=2 to x do
  if a[i]=0 then
  begin
    for j:=i to x div i do
      a[i*j]:=1;
    a[i]:=1;
  end 
  else a[i]:=0;
  for i:=1 to x do
    a[i]:=a[i]+a[i-1];
  for i:=1 to z do
  begin
    readln(n,m);
    if (n<1) or (m>x) then writeln('Crossing the line') 
    else
     writeln(a[m]-a[n-1]);
  end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值