区间素数概率判定(高精度)

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

精度太坑

 1 #include<cstdio>
 2 int su[10005];
 3 int judge(int n)
 4 {
 5     int i;
 6     for(i = 2 ; i*i <= n ; i++)
 7     {
 8         if(n % i == 0)
 9         return 0;
10     }
11     return 1;
12 }
13 int main()
14 {
15     int i;
16     for(i = 0 ; i <= 10005 ; i++)
17     {
18         su[i]=judge(i*i+i+41);
19     }
20     int a,b;
21     while(scanf("%d %d",&a,&b)!=EOF)
22     {
23         double sum=0;
24         for(i = a ; i <= b ; i++)
25         {
26             sum+=su[i];
27         }
28         printf("%.2f\n",sum*1.0/(b-a+1)*100);
29     }
30 }
时间: 2024-10-05 13:44:34

区间素数概率判定(高精度)的相关文章

【专题】素数的判定与筛法

素数的判定与筛法     判定:很简单嘛!暴力大法参上! #include<iostream> #include<cmath> unsigned long int n,i,j,a,b; using namespace std; int main() { cin>>n; j=(int)sqrt(n); for(i=2;i<=j;i++) if(n%i==0) break; if(i>j&&n!=0&&n!=1) cout<

【数论】素数的判定与筛法

素数的判定与筛法     判定:很简单嘛!暴力大法参上! #include<iostream> #include<cmath> unsigned long int n,i,j,a,b; using namespace std; int main() { cin>>n; j=(int)sqrt(n); for(i=2;i<=j;i++) if(n%i==0) break; if(i>j&&n!=0&&n!=1) cout<

LightOJ 1197 LightOJ 1197(大区间素数筛选)

http://lightoj.com/volume_showproblem.php?problem=1197 题目大意: 就是给你一个区间[a,b]让你求这个区间素数的个数 但a.b的值太大没法直接进行素数筛选(没法开那么大的数组),我们可以将a当做0,将b当做b-a 这样求[a,b]之间就变成了求[0, b - a]之间,这样就可以开数组来筛选 下图是代码式子j = j + prime[i] - a % prime[i]的由来 #include<stdio.h> #include<ma

hdu6069(简单数学+区间素数晒法)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 给出 l, r, k.求:(lambda d(i^k))mod998244353,其中 l <= i <= r, d(i) 为 i 的因子个数. 思路:若 x 分解成质因子乘积的形式为 x = p1^a1 * p2^a2 * ... * pn^an,那么 d(x) = (a1 + 1) * (a2 + 1) * ... * (an + 1) .显然 d(x^k) = (a1 * k

light_oj 1197 区间素数筛

light_oj 1197 区间素数筛 M - Help Hanzo Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1197 Description Amakusa, the evil spiritual leader has captured the beautiful princess Nakururu. The reason

素数的计算-埃氏筛法(区间素数利器)

素数,各种素数,各种题总是遇到素数. 下面我们来说一下求素数的一种比较有效的算法. 就是筛法.因为这个要求得1-n区间的素数只需要O(nloglogn)的时间复杂度. 下面来说一下它的思路. 思路:现在又1-n的数字,素数嘛就是除了1和本身之外没有其他的约数,所以有约数的都不是素数. 我们从2开始往后遍历,是2的倍数的都不是素数,所以我们把他们划掉 然后现在从2往后就是3了 因为3的前面没有能整除3的,所以3是素数,然后3的倍数全都不是素数,我们接着划掉. 然后就是5了,因为4是2的倍数不是素数

区间素数筛模版

区间素数筛模版 筛出区间[a,b]的素数.(b-a<=10000,1<=a<=b<=2^31) 存在P中,素数个数即为P的size(). ll a,b; bool isprime[maxn]; vector<ll> prime; bool isP[maxn]; vector<ll> P; void play_prime() { memset(isprime,1,sizeof(isprime)); isprime[1]=0; for(int i=2;i<

LightOj 1197 Help Hanzo (区间素数筛选)

题目大意: 给出T个实例,T<=200,给出[a,b]区间,问这个区间里面有多少个素数?(1 ≤ a ≤ b < 231, b - a ≤ 100000) 解题思路: 由于a,b的取值范围比较大,无法把这个区间内的所以素数全部筛选出来,但是b-a这个区间比较小,所以可以用区间素数筛选的办法解决这个题目. 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<

洛谷 P1865 A % B Problem(简单区间素数) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1865 题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line 输入输出样例 输入样例#1: 2 5 1 3