数学基础升级版 艾庆兴.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文档。上传文档
查看更多
数学基础升级版 艾庆兴

数学基础升级版 ——艾庆兴 初试身手 分析 输入:12 216 当前是12,目标是216,离目标还216/12=18 12的因子有2,3,4,6,12 显然,12和4不能乘,只有2,3,6可以 当然乘6! WHY? 6=GCD(18,12)! 欧拉函数 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。 Euler函数表达通式: euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn), 其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。 代码 思路:筛法(求出每个素因数) 例题 思路1 最裸的思路自然是N^2枚举每一对点,然后判断每个点是否能被看到。 (2,4):不能被看到,因为有(1,2)挡着 (3,6):不能被看到,因为有(1,3)挡着 …… 推理得:(x,y)能被看到的条件,等价于: gcd(x,y)=1。 思路2 在思路1的基础上,可以枚举i从1-N,然后求出有多少个数字和i的最大公约数是1。 这不就是求和i互质的个数有多少个么? 欧拉函数! 例题 TOO HARD?先找找规律 输入55 50 每个k%i(1-50)的值: 0 0 2 2 0 2 1 2 5 0 6 2 11 8 5 2 16 14 12 10 8 6 4 2 0 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 50 50 50 50 50 ik:都是k k/2~k:公差是1的等差数列 k/3~k/2:公差是2的等差数列 k/4~k/3:公差是3的等差数列 …… 解法 计算 [k+1,n] [k/2+1,k] [k/3+1,k/2] [k/4+1,k/3] ...… 对应区间等差数列的值。 一旦剩余所有没有计算的数字个数=10^6,直接暴力计算即可。 扩展欧几里得 扩展欧几里得算法 a*x mod b = 1 等价于 a*x+b*y=1 假设,在求gcd(a,b)算法的最后一步, if (b==0) return a; b=0,那么gcd=a,由于a*x mod b=1,所以gcd(a,b)必然是1。 那么此时:a*1+b*0=1成立,此时x=1,y=0 扩展欧几里得算法 考虑上一次调用到gcd(a,b)的位置gcd(a,b)。 return gcd(b,a%b) 那么,在这一层,有: ax+by=1; ax+by=1 又a=b,b=a%b 所以有 bx+(a%b)y=1 扩展欧几里得算法 ax+by=1; bx+(a%b)y=1 此处,只有x,y是未知数。 bx+(a%b)y =bx+(a-[a/b]*b)y =ay+bx-b[a/b]y=ay+b(x-[a/b]y) 由于ax+by=ay+b(x-[a/b]y) 当x=y时,y=x-[a/b]y 代码 struct nod{int x,int y,int ans}; nod ext_gcd(int a,int b) { nod ans,temp; if (b==0){ ans.x=1;ans.y=0; ans.ans=a;return ans;} temp=ext_gcd(b,a%b); ans.ans=temp.ans; ans.x=temp.y; //x=y ans.y=temp.x-a/b*temp.y; //y=x-[a/b]y return ans; } 再来看题目 分析 通过ext_gcd,求出了一组满足 ax+by=1的(x,y) 那么,(x+b,y-a)也是一组整数解: 证明:(x+b,y-a)带入后得 a(x+b)+b(y-a)=ax+ab+by-ba=ax+by=1 题目要求最小的x,所以直接算即可。 扩展 求ax%b=c的最小x,c保证是gcd(a,b)的倍数。 gcd(a,b)=t。 那么,通过ext_gcd可以求出一组(x,y)使得 ax+by=t。 那么,两边同乘以(c/t),则: ax(c/t)+by(c/t)=c。 得解 扩展 a*b%mod=a%mod*b%mod, 那么a/b%mod怎么算? 要是有一个数字c满足: 对于任何一个数字a都有: a/b%mod=a*c%mod, 那么a/b%mod=a%mod*c%mod 这个问题就解决了。 扩展 推理: 由于a/b%mod=a*c%mod,两边同乘b,除

文档评论(0)

baoyue + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档