埃氏筛:(适用1e7以内)
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N=1e7+9;
int prime[N];
bool visit[N];
int sieve(int n){
for(int i=0;i<=n;i++) visit[i]=false;
for(int i=2;i*i<=n;i++)
if(!visit[i])
for(int j=i*i;j<=n;j+=i)
visit[j]=true;
int k=0;
for(int i=2;i<=n;i++)
if(!visit[i])
prime[k++]=i;
return k;
}
int main(){
//特判
int l,k;
cin>>l>>k;
int r1,r2;
if(l==1){
r1=0;
}else{
r1=sieve(l-1);
}
r2=sieve(l+2*k-1);
//cout<<r1<<" "<<r2<<endl;
int res=r2-r1;
if(res>k){
cout<"Yes";
}else{
cout<<"No";
}
return 0;
}
求区间素数:(最大可为1e11)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e11;
const int maxp=10+sqrt(1e11);
ll f[maxp],g[maxp];
ll solve(ll n)
{
ll i,j,m;
for(m=1;m*m<=n;m++)
f[m]=n/m-1;
for(i=1;i<=m;i++)
g[i]=i-1;
for(i=2;i<=m;i++)
{
if(g[i]==g[i-1]) continue;
for(j=1;j<=min(m-1,n/i/i);j++)
{
if(i*j<m)
f[j]-=f[i*j]-g[i-1];
else
f[j]-=g[n/i/j]-g[i-1];
}
for(j=m;j>=i*i;j--)
g[j]-=g[j/i]-g[i-1];
}
return f[1];
}
int main()
{
int l,k;
cin>>l>>k;
int r1=0,r2=0;
if(l!=1){
r1=solve(l-1);
}
r2=solve(l+2*k-1);
// //
// cout<<r1<<" "<<r2<<endl;
if(r2-r1>k){
cout<<"Yes";
}else{
cout<<"No";
}
// ll n;
// while(scanf("%lld",&n)!=EOF)
// printf("%lld\n",solve(n));
return 0;
}
一道题解惊人的素数相关题:
虽说都知道数越大时素数越稀疏,但我实在没想到这道题可以这么写:
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int l,k;
cin>>l>>k;
if(l<3&&k<4){
cout<<"Yes";
}else{
cout<<"No";
}
return 0;
}
一道与素数无关但也难以想到的题:
题解是这样婶儿的:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
if(m==1){//也就是说n个人在同一组
cout<<n+1<<endl;
}else{
if(n/m==1){//即每个组只有1人
cout<<2<<endl;//一张地图就可
}else{
cout<<3<<endl;//这个我理解起来有点儿牵强,哪位善人懂了可以告诉我下
}
}
}
}
加油加油!不能躺!