P1865 A % B Problem

题目背景

题目名称是吸引你点进来的。
实际上该题还是很水的。

题目描述

给定 l,rl, rl,r,求区间 [l,r][l, r][l,r] 内质数的个数。

输入格式

第一行有两个整数,分别代表询问次数 nnn 和 给定区间的右端点最大值 mmm

接下来 nnn 行,每行两个整数 l,rl, rl,r,代表一次查询。

输出格式

对于每次查询输出一行,若 l,r∈[1,m]l, r \in [1, m]l,r[1,m],则输出区间质数个数,否则输出 Crossing the line

输入输出样例 #1

输入 #1

2 5
1 3
2 6

输出 #1

2
Crossing the line

说明/提示

数据范围与约定
  • 对于 20%20\%20% 的数据,保证 n,m≤10n,m\le 10n,m10
  • 对于 100%100\%100% 的数据,保证 1≤n≤10001\le n\le10001n10001≤m≤1061\le m\le10^61m106−109≤l≤r≤109-10^9\le l\le r\le 10^9109lr109

C++实现

#include<bits/stdc++.h>
using namespace std;

int f[1000001];
bool vis[1000001];
void shai(int n){
    f[1]=0;
    vis[1]=true;
    for(int i=2;i<=n;i++)    {
        if(vis[i]==false)  {
            f[i]=f[i-1]+1;//前缀和计算
            for(int j=i+i;j<=n;j=j+i)    {
                vis[j]=true;//标记操作
            }
        }
        else f[i]=f[i-1];//前缀和转移
    }
}
int main(){
    int n,m;
    scanf("%d%d",&m,&n);
    shai(n);
    for(int i=1;i<=m;i++) {
        int l,r;
        scanf("%d%d",&l,&r);
        if(l<1 || r>n) cout<<"Crossing the line"<<endl;//判断是否超出区间
        else   {
            int y=f[r]-f[l-1];//此处已经修改
            cout<<y<<endl;
        }
    }
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐