有两个板子 一个M个某数字是否为质数的询问 一个求区间质数个数
题目描述
如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)
输入输出格式
输入格式:
第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。
接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。
输出格式:
输出包含M行,每行为Yes或No,即依次为每一个询问的结果。
输入输出样例
输入样例#1: 复制
100 5
2
3
4
91
97
输出样例#1: 复制
Yes
Yes
No
No
Yes
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<map>
#define exp 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int randomm[3]={2,7,61};//底数
LL Q_Pow(LL a,LL b,LL mod)
{
LL ret=1;
LL sum=a%mod;
while(b)
{
if(b&1)
ret=(ret*sum)%mod;
b>>=1;
sum=sum*sum%mod;
}
return ret;
}//快速幂,用来加快计算和防止爆long long
bool witness(LL a,LL n)//Miller Rabin算法的重点
{
LL tem=n-1;
int j=0;
while(tem%2==0)
{
tem/=2;
j++;
}//把n-1拆分为2^s*r的形式,这里j为s,tem为r
LL x=Q_Pow(a,tem,n);
if(x==1||x==n-1) return true;
while(j--)
{
x=x*x%n;
if(x==n-1) return true;
}//否则判断等式a^(2jr) ≡-1 mod n 看是否有满足的 j
return false;
}
bool Miller_Rabin(LL n)
{
if(n==2||n==7||n==61) return true;
if(n<2||n%2==0||n%7==0||n%61==0) return false;//因为要满足a与n是互素的任何随机整数,所以要特判
for(int i=0;i<3;i++)
{
LL a=randomm[i];
if(a!=n)
{
if(!witness(a,n)) return false;
}
}
return true;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
LL xx;
for(int i=1;i<=m;i++)
{
cin>>xx;
if(Miller_Rabin(xx)) //判断是不是素数
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}
题目描述
求区间质数个数
输入输出格式
输入格式:
一行两个整数 询问次数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
#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;
}