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 formula output 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.
Sample Input
0 39
0 40
39 40
Sample Output
100.00
97.56
50.00
思路: 求大区间内的素数,是绝对不可以暴力哒,毕竟空间和时间上都有限制。
这时我们利用下前缀和优化区间问题。
注意: 这题被精度卡住了,最后输出要加1e-8。然而并不知道原理为神马QAQ(被WA 7发)
AC代码:
#include<bits/stdc++.h>
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define rev(i,s,e) for(int i=e;i>=s;i--)
using namespace std;
const int maxn = 1e4+5;
typedef long long LL;
int sum[maxn];
bool isprime(int n)
{
for(int i=2;i<=sqrt(n);i++)
if(n%i == 0) return false;
return true;
}
int cul(int n)
{
return n*n+n+41;
}
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE
int a,b;
sum[0] = 1;
rep(i,1,10000)
{
sum[i] = sum[i-1];
if(isprime(cul(i)))
sum[i]++;
}
while(~scanf("%d %d",&a,&b))
{
int k;
if(!a) k = sum[b];
else k = sum[b]-sum[a-1];
printf("%.2f\n",(k*1.0/(b-a+1))*100+1e-8);//注意精度
}
return 0;
}