UVA 10200 Prime Time(简单素数判定预处理)

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;
}

  

 

posted @ 2015-08-05 17:38  Bug_Clearlove  阅读(277)  评论(0编辑  收藏  举报