- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
竞赛辅导——数论问题
数论问题 Lecture by Hao Wu 常见的数论问题 1.数的幂运算 2.欧拉定理的应用 3.素数测试 4.Pell方程 5.其它 案例1:模的运算 描述 人与人是不同的,有些人喜欢阅读满是女孩子的杂志,有些人喜欢在地下室引爆炸弹,而还有一些却喜欢一些麻烦的数字游戏。比如ESSE论坛的一次活动: 每个人选择两个数字Ai和Bi写在纸上,其他人不能看见。过了一段时间后,每个人说出自己纸上的数字,然后每个人的目标是求出所有的AiBi的和模M的值,最先算出结果的,就是胜利者。 作为一个程序员,你当然有办法编一个程序,以最快的速度算出结果,赢得比赛。 相当于求 A1B1+A2B2+...+AHBH) mod M. 解题思路(1) 取模运算可以与加、减、乘、乘方交换次序; (a+b)%m=a%m+b%m a*b%m=(a%m)*(b%m) ab%m=(a%m)b 解题思路(2) 有一类常见的运算,就是求形如的值,一般情况下,我们可以用幂的定义来做:通过乘法的倍乘来实现,需要做b次乘法和模运算。如果b比较大时,这样的方法就不行了,本节介绍一种只需要O(log2b)次乘法和模运算的方法。 解题思路(3) 首先将指数变成二的幂次和的形式。如5=1+4=20+22,11=1+2+8=20+21+23。如果b可以表示为的形式,那么ab可以表示为 解题思路(4) 表面上看这样的表达式更复杂了,但注意到上面的表达式的乘积项不超过(log2b),同时,形如(i=0,1….)有如下的递推式: 解题思路(5) 后项可以通过前项的平方来得到。所以可以先的值求出来,不超过(log2b)次乘法。 核心代码及解释 (1) voidcal(unsigned*r,longunsigneda,unsignedm){ //计算a的2j次方对m取模的结果,用数组r保存 r[0]=a%m; for(i=1;i32;++i) r[i]=(long)r[i-1]*r[i-1]%m;//ri+1=ri*ri } 核心代码及解释 (2) unsignedcalc(unsignedm,longunsigneda,longunsignedb){ //函数计算ab%m的值 intbl[32],r[32];//bl是b的二进制结果,r[i]=a的2j次方对m取模的结果 cal(r,a,m);//计算r[i] while(b){//将b用二进制形式表示,结果保存在bl中 bl[i++]=b%2; b=1;} for(j=0,k=1;ji;++j)//计算乘方,时间复杂度为i=O(log2b) if(bl[j])//如果b对应二进制位bj为1,则对应的rbj在幂的乘积表达式中,否则不在 k=k*r[j]%m; Return k;} 核心代码及解释 (3) Int main(){ scanf(%d,z); while(z--){ scanf(%u%d,m,i); for(j=s=0;ji;++j){ scanf(%lu%lu,a,b); s=(s+calc(m,a,b))%m;}//计算AjBj的值,并将其和求出来,结果用变量s保存 printf(%u\n,s);}} 欧拉定理1 如果p是素数,则对任意的a,有 欧拉定理2 如果p不是素数,则对任意的a,有 案例2:快乐2004 Time Limit: 1000ms Special Time Limit:2500ms Memory Limit:32768KB 描述 考虑到一个正整数X,S是所有2004X的因子的和,你的目标是求出S除以29的余数。 看看X=1的例子,20041的所有因子为1,2,3,4,6,12,167,334,501,668,1002和2004,因此S=4704,而4704 mod 29 =6。 输入 输入有多个测试序列,每个测试序列一行一个正整数X,(1=X。 X=0表示输入结束,并且不需要处理。 输出 对每个测试序列,输出一行就是S除以29的余数。 输入样例 1 10000 0 输出样例 6 10 解题思路(1) 题目要求的是(2004X)的因子和对29取模的结果 求某个数A的所有因子和,首先将该数分解: 其中p1,p2,...,pn都是素数,则A的任意因子可以表示为: 解题思路(2) 如:2004=22*3*167,则 解题思路(3) 解题思路(4) X还很大( ),根据Euler定理 解题思路(5) 解题思路(6) 当X=10000时,计算200410000=220000*310000所有因子和对29取模的结果 核心代码及解释 (1) int mod29(int x) { for
您可能关注的文档
最近下载
- 人力资源管理课后答案德斯勒.docx
- 马克思主义新闻观十二讲之第九讲实现新闻传播权利与社会责任的统一.docx VIP
- 国际航运管理 全套课件.PPT VIP
- 财务共享服务教学课件4第四章 费用报销流程.pptx VIP
- 手术患者意外伤害预防.pptx VIP
- 2025年新人教版数学7年级上册整册同步教学课件.pptx
- 广告理论与实务:各类广告媒介PPT教学课件.pptx VIP
- 第1课 课题一《课外生活小调查·周末生活我采访》(教学设计)-2024-2025学年三年级上册综合实践活动浙教版.docx VIP
- 广告理论与实务:印刷媒体广告PPT教学课件.pptx VIP
- 铭记历史·开创未来--2025-2026学年高一上学期纪念抗日战争胜利80周年爱国主义教育主题班会.pptx VIP
文档评论(0)