Euler is a well-known matematician, and, among many other things, he discovered that the formula n 2 + n + 41 produces a prime for 0 ≤ n < 40. For n = 40, the formula produces 1681, which is 41 ∗ 41. Even though this formula doesn’t always produce a prime, it still produces a lot of primes. It’s known that for n ≤ 10000000, there are 47,5% of primes produced by the formula! So, you’ll write a program that will output how many primes does the formulaoutput for a certain interval.
Input
Each line of input will be given two positive integer a and b such that 0 ≤ a ≤ b ≤ 10000. You must read until the end of the file.
Output
For each pair a, b read, you must output the percentage of prime numbers produced by the formula in this interval (a ≤ n ≤ b) rounded to two decimal digits. SampleInput
0 39
0 40
39 40
Sample Output
100.00
97.56
50.00
最大值是100010041.
用vector来记录1~sqrt(100010041+0.5)所有的素数。
然后1到10000进行判断素数进行pp数组的预处理
ans = pp[b] - pp[a-1]。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e7+10;
vector<LL> prime;
bool vis[N];
int pp[N];
void init(){
memset(vis,false,sizeof vis);
for(int i=2;i<=N;i++) if(!vis[i]){
prime.push_back(i);
for(int j=i;j<=N;j+=i) vis[j]=true;
}
memset(pp,0,sizeof pp);pp[0]=1;
for(int i=1;i<=10000;i++){
LL v = i*i + i +41;
bool cp=false;
for(int j=0;prime[j]*prime[j]<=v;j++)
if(v%prime[j]==0) {cp=true;break;}
if(cp) pp[i]=pp[i-1];
else pp[i]=pp[i-1]+1;
}
}
int main()
{
init();int a,b;
while(~scanf("%d%d",&a,&b)){
double c ,d;
if(a) c = pp[b]-pp[a-1],d=b-a+1;
else c=pp[b],d=b+1;
double ans = c/d*100;
ans+=1e-5 ;//这里是4舍5入
printf("%.2f\n",ans);
}
return 0;
}