素数

欧拉筛法(线性筛)素数

折月煮酒 提交于 2019-12-07 13:04:31
#include<bits/stdc++.h> using namespace std; #define maxn 40 int prime[maxn]; int visit[maxn]; void Prime(){//埃氏筛法 memset(visit,0,sizeof(visit)); //初始化都是素数 visit[0] = visit[1] = 1; //0 和 1不是素数 for (int i = 2; i <= maxn; i++) { if (!visit[i]) { //如果i是素数,让i的所有倍数都不是素数 for (int j = i*i; j <= maxn; j += i) { visit[j] = 1; } } } } /*void Prime(){//欧拉筛法:在上面基础上不会重复 如2*8=16 4*4=16 int cnt=0; memset(visit,0,sizeof(visit)); memset(prime,0,sizeof(prime)); for (int i = 2;i <= maxn; i++) { if(!visit[i]) { prime[++cnt]=i; } for (int j=1;j<=cnt&&i*prime[j]<=maxn;j++) { //cout<<" i = "<<i<<" j = "<<j<<" prime[

hdu3988 Harry Potter and the Hide Story(数论-勒让德定理-质因子分解)

二次信任 提交于 2019-12-07 12:45:54
题意 给出一个n,一个k,求k的最大次方ans,能被n!整除 思路来源 http://www.cnblogs.com/toyking/p/3893157.html 题解 先预处理1e7以内的素数,O(nlognlogn) 每个k,对素数表里跑一遍, 这样素数枚举的时候,O(T·cnt),就不是O(T·sqrt(k))了 剩下的操作,和今晚的上个题相同(见上篇UVA-10780), 就是数据量大了点。 心得 这题WA了五发,心态爆炸…… ①int i*i可能爆int,埃氏筛法改了一发 ②ans可能大于1e18,令n=1e18,k=2即可,但这种情况也不会超过2e18 因此将ans至少初始化为2e18,只有k=1的情况是inf ③unsigned long long, 后来证明没必要 ,不会爆1e19 ④循环i*=t的时候可能爆ll,所以改成从n向下除 ⑤开始把n和k的顺序搞反了 ⑥prime数组只开了1e5,后来扩容开到1e6, 后来证明没必要 ⑦map整数枚举的时候,prime[i]>n了直接break跳出,能将时间从4960ms缩到1760ms 代码风格还是太辣鸡,各种出小错。 代码 #include <iostream> #include <cstdio> #include <cstring> #include <map> const int maxn=1e7+10;

【数论-Lucas定理】

旧城冷巷雨未停 提交于 2019-12-07 12:41:56
1.写在前面:我始终觉得,对于一个问题要知其然,更要知其所以然。Lucas定理在刚刚接触数论的时候就知道了,因为这是一个很常用的定理,常常和中国剩余定理放在一起考。最近在组合数学上出现了很多问题,但是都是找个结论就过去了。浑浑噩噩并不懂其中原理,感觉自己的数学直觉一直在下降,以前我甚至能够从数据中看出来数学表达式,后来学了很多的工具,就变懒了,甚至连一个稍微复杂一点的积分都懒得动手,直接自适应Simpson积过去。今天又拿起了笔,准备把Lucas定理自己证明一遍。证完之后,我似乎又看到之前的那个影子:不畏惧任何数学表达式,即使推导了十几页也毫不畏惧。废话到此结束,正题开始。 2.Lucass定理: Lucas定理是同余理论中的一个很重要的定理,用于组合数取模。常常使用在问题的结果需要对某个数据取模,n,m很大,达到1e15以上,但是p在1e9以内。一般来说最好的效果实在1e5以内。看到这个式子,一个十分典型的递归,并且注意到p是素数。所以我们就会有很多疑问:这个定理怎么来的?p为什么一定要是素数?p不是素数可以吗?我们来解决这些问题。 3.在解决这个问题之前,我想说一个问题:记得是ZOJ的某次月赛吧,问题就是求: . 其实说白了,就是统计杨辉三角形每一行中有多少个奇数。这个问题当时我打了个表,看出了规律。结论和i和n的二进制有关,但是为什么呢? 4.首先证明Lucas定理。

1007 素数对猜想 (20)(20 分)

只谈情不闲聊 提交于 2019-12-06 23:37:42
1007 素数对猜想 (20)(20 分) 让我们定义 d~n~ 为:d~n~ = p~n+1~ - p~n~,其中 p~i~ 是第i个素数。显然有 d~1~=1 且对于n&gt1有 d~n~ 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10^5^),请计算不超过N的满足猜想的素数对的个数。 输入格式:每个测试输入包含1个测试用例,给出正整数N。 输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 先打素数表,然后遍历计数 #include<stdio.h> #include<math.h> int a[ 100000 ]; int main() { int n,i,t,j,k; scanf ( "%d" ,&n); k= 0 ; for (i= 2 ;i<=n;i++) { for (j= 2 ;j<= sqrt (i);j++) { if (i%j== 0 ) break ; } if (j> sqrt (i)) { a[k++]=i; } } t= 0 ; for (i= 1 ;i<=n;i++) { if (a[i+ 1 ]-a[i]== 2 ){ t++; } } printf ( "%d" ,t); return 0 ; } 来源: CSDN 作者: 码奴生来就只知道前进

素数对猜想 (20 分)

三世轮回 提交于 2019-12-06 23:34:15
让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 普通求素数的算法会超时,要提高算法效率。 # include <bits/stdc++.h> using namespace std ; int a [ 100001 ] , p [ 100001 ] ; bool x [ 100001 ] ; int main ( ) { int n , t = 2 , cnt = 0 ; cin >> n ; a [ 1 ] = 2 ; for ( int i = 2 ; i <= n ; i ++ ) { if ( i % 2 ) x [ i ] = true ; else x [ i ] = false ; } for ( int i = 3 ; i <= sqrt ( n ) ; i ++ ) { if ( x [ i ] ) { for ( int j = i + i ; j < n ; j = j + i ) { x [ j ]

PAT_B_1007 素数对猜想 (20 分)【超时问题】

天大地大妈咪最大 提交于 2019-12-06 23:33:59
PS:刚开始写博客 ,格式掌握不好,希望见谅 让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数 N (<10​5​​),请计算不超过 N 的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数 N 。 输出格式: 在一行中输出不超过 N 的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 #include<iostream> #include<math.h> using namespace std; int sushu(int n) { int flag = 1; int i = 2; int nn = sqrt(n); while (i <= nn) //判断到根号下n即可,之后的数字是重复 { if (n % i == 0) { flag = 0; break; } ++i; } return flag; } int main() { int n; cin >> n; int count = 0, issushu = 0; int pn = 2, pn1 = 2; for (int i = 3; i <= n; i++) { if (i % 2 == 0)continue; issushu =

Python:1007 素数对猜想

守給你的承諾、 提交于 2019-12-06 23:33:43
很尴尬,忘了什么是素数了 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 文章目录 一、题目 二、代码 一、题目 二、代码 思想 : 这个题目本身不难,难的是对题目的优化 需要知道素数的定义,知道和奇数的区别 对代码的优化解决掉超时的问题,优化可以从以下考虑 将除了 2 的偶数自动过滤,不参加运算 将每次符合要求的数加入列表,后面的数字只需要和列表中的数进行比较即可,看看是否是素数 然而,结果很残酷,总是最后一个超时运算,观察大佬的代码,大概意思就是,合乎要求的数中除了 2 和 3 之外,其余的数都与6的倍数想差1 比如 :[2,3,5,7,11,13,17,19] 但是,不好理解,也不好编写代码,所以先记录下,希望有后续把 后续来了,另外一种思路是一旦一个数符合要求,那么他的倍数将不符合要求,比如2符合则,4,6,8等不符合要求,3符合要求则 6,9,12等不符合要求 因此思路是建立一个N+2 的列表(加2是因为从2开始判断到N结束,所以长度加2)值均为1,找到一个素数后,然后将N以内的该素数的倍数相应位置为0 N = int ( input ( ) ) n = 0 num = [ ] for i in range ( 2 , N + 1 ) : flag = 1 if i == 2 or i % 2 != 0 : for j in num : if i %

PAT 1007. 素数对猜想 python 运行超时问题解决方案

二次信任 提交于 2019-12-06 23:33:07
原问题 https://www.patest.cn/contests/pat-b-practise/1007 让我们定义 d n 为:d n = p n+1 - p n ,其中 p i 是第i个素数。显然有 d 1 =1 且对于n>1有 d n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10 5 ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 思路非常简单,一个函数判断某个数是否为质数,主函数从5循环到正整数N即可,关键问题在于判断质数的函数效率如何 以下从低到高说几种质数判断方法(number为待判定的数): LEVEL 0. up_limit = number #以number本身作为循环上限 for i in range(2, up_limit) : #尝试从2到number-1的每一个数是否可以被number整除 if number % i == 0 : #余数为零则不是素数 return False return True LEVEL 0.5. up_limit = int( number/2) #不用多说吧,最小的除数是2,不可能有大于 number/2

PAT(Python)-1007:素数对猜想(20)

余生长醉 提交于 2019-12-06 23:32:48
让我们定义 d n 为:d n = p n+1 - p n ,其中 p i 是第i个素数。显然有 d 1 =1 且对于n>1有 d n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10 5 ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 import math def prime(N): # 生成函数用来判断素数 for j in range(2,int(math.sqrt(N))+1,1): if N % j == 0: return False return True n = int(input()) li = [i for i in range(2, n+1) if prime(i) and prime(i+2) and (i+2<=n)] # 每组素数对都应该是素数且相差2,将满足条件的素数放入li print(len(li)) 来源: CSDN 作者: qilixuening 链接: https://blog.csdn.net/qilixuening/article/details/70162119

[PAT乙级]1007. 素数对猜想 (20)

爷,独闯天下 提交于 2019-12-06 23:32:38
1007. 素数对猜想 (20) 原题链接 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。 “素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。 输入格式:每个测试输入包含1个测试用例,给出正整数N。 输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 注意: 第一次提交显示运行超时,判断素数时for循环里写的是j小于i,N很大时会显示运行超时 代码是双层for循环嵌套,时间复杂度(On^2) 改进后内部for循环条件为j*j<=i,当N很大时,减少很大一部分运行时间 代码: #include <iostream> using namespace std ; int main() { int N; cin >> N; int res = 0 ; int a= 2 ,b= 3 ; for ( int i= 5 ; i<=N; i++){ bool temp = true ; for ( int j= 2 ; j*j<=i; j++){ //j*j很重要,减少运行时间 if (i%j == 0 ){ temp = false ; break ; } } if (temp){