先素数打表,再将n2 + n + 41之中的素数个数打表前缀和即可,不过最后精度有点迷,不知哪位大佬能解释一下。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define maxn 11000
bool is[maxn+6];
int su[maxn],cnt;
void prime()
{
cnt=1;
memset(is,1,sizeof(is));
is[0]=is[1]=0;
for(int i=2;i<=maxn;i++)
{
if(is[i])
su[cnt++]=i;
for(int j=1;j<cnt&&su[j]*i<=maxn;j++)
{
is[su[j]*i]=0;
}
}
}
int sum[10025];
void init()
{
sum[0]=1;
for(int i=1;i<=10005;i++)
{
sum[i]=sum[i-1];
int x=i*i+i+41;
if(x<maxn)
{
if(is[x])
sum[i]++;
}
else
{
int flag=0;
for(int j=1;j<cnt;j++)
{
if(x%su[j]==0)
{
flag=1;
break;
}
}
if(flag==0)
{
sum[i]++;
}
}
}
}
int main()
{
prime();
init();
int a,b,ans;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a)
ans=sum[b]-sum[a-1];
else
ans=sum[b];
ans=ans*100;
double x=(double)ans/(b-a+1);
printf("%.2lf\n",x+1e-5);
}
return 0;
}