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