打卡信奥刷题(1100)用C++实现信奥 P1865 A % B Problem
·
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,m≤10。
- 对于 100%100\%100% 的数据,保证 1≤n≤10001\le n\le10001≤n≤1000,1≤m≤1061\le m\le10^61≤m≤106,−109≤l≤r≤109-10^9\le l\le r\le 10^9−109≤l≤r≤109。
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐



所有评论(0)