1,题目:
2,思路:
主要分两点1:如何快速算出一个大区间内的所有素数。
2:如何找到最长连续素数和。
1:寻找素数通过乘法的方式即如果一个数可以用i*2(i>=2)表示那么它必是素数
2:前缀和(需要优化)(详见代码中的优化和注)
3代码:
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
long long n;
int busushu[1000005]={0},sushu[500010]={0};
void iss(){//寻找素数
for(int i=2;i*i<=n;i++){
if(busushu[i]==0){
for(int j=i*2;j<=n;j+=i){
busushu[j]=1;
}
}
}
}
long long qjh[500005]={0};
int main(){
long long m=0,max1=0,maxx=0;
cin>>n;
iss();
for(int i=2;i<=n;i++){
if(busushu[i]==0){
sushu[++m]=i;
}
}
for(int i=1;i<=m;i++){
qjh[i]=qjh[i-1]+sushu[i];//前缀和
}
for(int i=m;i>=1;i--){
for(int j=i;j>=1;j--){//优化,从后往前遍历
if(qjh[i]-qjh[j-1]>n)break;//优化,大于n的直接退出
if(busushu[qjh[i]-qjh[j-1]]==0){
if(i-j+1>max1){//注 :这里只能是>不能是>=
max1=i-j+1;
maxx=qjh[i]-qjh[j-1];//目标数值
}
}
}
}
cout<<maxx;
return 0;
}