第八讲ACM数论问题幻灯片.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
湖南工业大学 湖南工业大学 湖南工业大学 工大ACM团队 ACM数论问题 数论基本知识 信息学竞赛和程序设计竞赛中常考的数论知识关于素数和整 除,关键在于灵活应用 整除:如果a和b是整数,a≠0,若有整数c使b=ac,就说a整除b。在a整除b时,记a是b的一个因子,b是a的倍数。用符号a∣b表示a整除b,a不能整除b记为a ⊥b。 整除基本性质有: (1)若a∣b, a∣c,则a∣(b+c) (2)若a∣b,则对所有整数c, a∣bc (3)若a∣b, b∣c,则a∣c (传递性) 工大ACM团队 数论基本知识 素数(prime)和合数(compound),如果一个整数p只有1和p两个因子,则p为素数,不为素数的其它数为合数。如果n为合数,则n必有一个小于或等于n的平方根的数因子。 给出一个数n,如何判断它是不是素数? 朴素的判别法 从2开始试除小于n的所有自然数,时间复杂度为O(n). 如果a是n的因子,那么n/a也是n的因子,所以如果n有一个大于1的真因子,则它必有一个不大于n1/2的因子,时间复杂度O(n1/2)。 算术基本定理:每个正整数都可以唯一地表示成素数的乘积。其中素数因子从小到大依次出现。 最大公约数gcd(a, b) 最小公倍数lcm(a, b) ab=gcd(a, b)×lcm(a, b) 如果gcd(a, b)=1,则a与b互素。 工大ACM团队 素数算法 最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n)),适合n很小 num = 0; for(i=2; i=n; i++) { for(j=2; j=sqrt(i); j++) if( i%j==0 ) break; if( jsqrt(i) ) prime[num++] = i; } 工大ACM团队 素数 当n很大的时候,比如n=10,000,000时,n*sqrt(n)30,000,000,000,数量级相当大 思考如何改进? 工大ACM团队 素数筛法 最简单的素数筛法 开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false. 把奇数的倍数设为false. 见代码-prime_choice.c 改进的素数筛法 bool型数组里面只存奇数不存偶数。如定义prime[N],则0表示3,1表示5,2表示7,3表示9...。如果prime[0]为true,则表示3时素数。prime[3]为false意味着9是合数,每个单元代表的数是2*i+3。 欲求n以内的素数,就先把sqrt(n)内的素数求出来,用已经求得的素数来筛出后面的合数。 工大ACM团队 数论基本知识 如何求出1~n中的所有素数? Eraosthenes(爱拉托斯尼筛法)筛法:每次求出一个新的素数,就把n以内的它的所有倍数都筛去。 工大ACM团队 经典的Eraosthenes筛法: for (int i = 2; i * i N; i++) { ????if (tag[i]) continue; ????for (int j = i; i * j N; j++) ???????? tag[i*j] = 1; } for (int i = 2; i N; i++) ????if (!tag[i]) ???????? prime[tol++] = i; 一种线性筛素数的方法(复杂度是O(n)): void get_prime() { ?int cnt = 0; ????for (int i = 2; i N; i++) ???? { ????????if (!tag[i])???? p[cnt++] = i; ????????for (int j = 0; j cnt p[j] * i N; j++) ???????? { ???????????? tag[i*p[j]] = 1; ????????????if (i % p[j] == 0) ?????????????break; ???????? } ???? } }//可以用均摊分析的方法来分析算法的复杂度,由于每 个合数都唯一的被它的最小素因子筛一次,而每个合 数的最小素因子都是唯一的,总复杂度是O(n) Eraosthenes筛法的速度并不快,原因在于对于一个合数,这种方法会重复的标记 伪素数 同余:a≡b(mod m) 如果两个数a和b之差能被m整除,那么我们就说a和b对模数m同余。比如,100-60除以8正好除尽,我们就说100和60对于模数8同余。它的另一层含义就是说,100和60除以8的余数相同。a和b对m同余,我们记作a≡b(mod m)。比如,刚才的例子

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档