codevs 2530大质数

链接:http://codevs.cn/problem/1530/

解题思路:
这个题最关键的剪枝还是 因子小于平方根,但不是像原来那样用。
逆转思维,与其说判断哪些是质数,不如说判断哪些不是质数,更简单,更效率。
所有的合数都有一个共同的特点,就是能被拆成质因子。
那么已经出现的质因子,迟早有一次会成为一个合数的因子。
那么直接拿要判断的数挨个被质数除一遍,就可以直接判断是不是合数了。
写到这,前三个点就过了,至于最后一个100000,就是开头提到的剪枝。
不管怎样,一个合数里面的质因子一定也小于它的平方根
所以提前判断一下,试到第几个合数停止,即可效率大大提高。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 int n,ans,prime[100001],ph;//ph表示当前要搜的是第几个质数。
 6
 7 int divide(double x){//判断试到第几个素数为止
 8     int temp=(int)x;
 9     for (int i=1;i<ph;i++){
10         if (prime[i]>temp) return i-1;
11     }
12 }
13
14 int main(){
15     cin>>n;
16     prime[1]=2;
17     prime[2]=3;
18     ph=2;
19     bool check;
20     int temp,test;
21     while(ph<n){//递归
22         temp=prime[ph];
23         ph++;
24         while (1){
25             temp++;
26             test=divide(sqrt(temp));
27             for (int i=1;i<=test;i++) {
28                 if (temp % prime[i]==0) {check=true;break;}
29             }//挨个除一遍
30             if (check) {check=false;continue;}
31             prime[ph]=temp;
32             break;
33         }
34     }
35     cout<<prime[n];
36 }
时间: 2024-08-02 17:13:16

codevs 2530大质数的相关文章

素数筛 codevs 1675 大质数 2

1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来. 小明于是交给聪明的你.请你帮忙![wikioi-1530] …………………………以上为背景………………………… 老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来.小明又找到了你…… 输入描述 Input Description

codevs——1530 大质数

1530 大质数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来.(1<=n<=100000) 老师随机写了几个数,交给了小明.小明百度找了很久,都没能解决.现在交给聪明的你.请你帮忙! ———————————————————————————————————————————— 简单描述:把第n个质数找出来. 输入描述 Input Description

codevs——1675 大质数 2

1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来. 小明于是交给聪明的你.请你帮忙![wikioi-1530] …………………………以上为背景………………………… 老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来.小明又找到了你…… 输入描述 Input Description 一个正整数n

1675 大质数 2

1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来. 小明于是交给聪明的你.请你帮忙![wikioi-1530] …………………………以上为背景………………………… 老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来.小明又找到了你…… 输入描述 Input Description 一个正整数n. (

[翻译向]阶乘模大质数

本文大部分翻译自http://min-25.hatenablog.com/entry/2017/04/10/215046,有改动.min_25牛逼 考虑经典问题:求$n!\bmod p$,p为一个大质数. 令$v=\lfloor \sqrt{n} \rfloor$,设$g_p(x)=\prod_{i=1}^p (x+i)$,那么我们想要求$g_v(0),g_v(v)...g_v((v-1)v)$. 考虑倍增地求,假设我们有了$g_d(0),g_d(v)...g_d(dv)$,那么$g_d$本身也

hihocoder 1287 : 数论一&#183;Miller-Rabin质数测试 大质数判定

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近突然对密码学产生了兴趣,其中有个叫RSA的公钥密码算法.RSA算法的计算过程中,需要找一些很大的质数. 小Ho:要如何来找出足够大的质数呢? 小Hi:我倒是有一个想法,我们可以先随机一个特别大的初始奇数,然后检查它是不是质数,如果不是就找比它大2的数,一直重复,直到找到一个质数为止. 小Ho:这样好像可行,那我就这么办吧. 过了一会儿,小Ho拿来了一张写满数字的纸条. 小Ho:我用程序随机生成了一些初

Miller_Rabin大质数检验

质数检验有不少算法,一般使用的质数检验复杂度是\(O(\sqrt{n})\): 又如线性筛可以在\(O(n)\)的时间内求出所有1~n的质数 但是,当n非常大,连\(O(\sqrt{n})\)的复杂度也难以接受时,上述算法便不能满足要求 这篇blog记录了一些关于Miller_Rabin算法的内容 大家都知道的著名的费马小定理: \[a^{p-1}\equiv1\pmod p\] 其中\(a,p\)互质 我们猜想,任意选取\(a\),如果一个数\(p\)满足以上式子,那么它就很有可能是一个质数

分解大质数模板(复杂度小于sqrt(n))

//POJ 1811 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <time.h> using namespace std; typedef __int64 lld; lld ran() { return rand() << 16 | rand(); } lld gcd(lld a, lld b) { retu

数据结构--栈 codevs 1107 等价表达式

codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这