收藏 分享(赏)

03-acm数论问题.ppt

上传人:天天快乐 文档编号:1103468 上传时间:2018-06-11 格式:PPT 页数:26 大小:230.50KB
下载 相关 举报
03-acm数论问题.ppt_第1页
第1页 / 共26页
03-acm数论问题.ppt_第2页
第2页 / 共26页
03-acm数论问题.ppt_第3页
第3页 / 共26页
03-acm数论问题.ppt_第4页
第4页 / 共26页
03-acm数论问题.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、ACM数论问题,工大ACM团队,数论基本知识,信息学竞赛和程序设计竞赛中常考的数论知识关于素数和整除,关键在于灵活应用整除:如果a和b是整数,a0,若有整数c使bac,就说a整除b。在a整除b时,记a是b的一个因子,b是a的倍数。用符号ab表示a整除b,a不能整除b记为a b。整除基本性质有:(1)若ab, ac,则a(bc)(2)若ab,则对所有整数c, abc(3)若ab, bc,则ac (传递性),工大ACM团队,数论基本知识,素数(prime)和合数(compound),如果一个整数p只有1和p两个因子,则p为素数,不为素数的其它数为合数。如果n为合数,则n必有一个小于或等于n的平方根

2、的数因子。给出一个数n,如何判断它是不是素数?朴素的判别法 从2开始试除小于n的所有自然数,时间复杂度为O(n).如果a是n的因子,那么n/a也是n的因子,所以如果n有一个大于1的真因子,则它必有一个不大于n1/2的因子,时间复杂度O(n1/2)。算术基本定理:每个正整数都可以唯一地表示成素数的乘积。其中素数因子从小到大依次出现。最大公约数gcd(a, b)最小公倍数lcm(a, b)abgcd(a, b)lcm(a, b)如果gcd(a, b)=1,则a与b互素。,工大ACM团队,素数算法,最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n),适合n很小num = 0; for(i=

3、2; isqrt(i) ) primenum+ = 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型数组里面只存奇数不存偶数。如定义primeN,则0表示3,1表示5,2表示7,3表示9.。如果prime0为true,则表示3时素数。pr

4、ime3为false意味着9是合数,每个单元代表的数是2*i+3。欲求n以内的素数,就先把sqrt(n)内的素数求出来,用已经求得的素数来筛出后面的合数。,工大ACM团队,数论基本知识,如何求出1n中的所有素数? Eraosthenes(爱拉托斯尼筛法)筛法:每次求出一个新的素数,就把n以内的它的所有倍数都筛去。,经典的Eraosthenes筛法:for (int i = 2; i * i N; i+)if (tagi) continue;for (int j = i; i * j N; j+) tagi*j = 1;for (int i = 2; i N; i+)if (!tagi) pri

5、metol+ = i;,一种线性筛素数的方法(复杂度是O(n)):void get_prime() int cnt = 0;for (int i = 2; i N; i+) if (!tagi) pcnt+ = i;for (int j = 0; j b。 1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0; 2,ab0 时 设 ax1+by1=gcd(a,b); bx2+(a mod b)y2=gcd(b,a mod b); 根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b); 则:ax1+by1=bx2+(a mod b)y2; 即:ax1+by1=bx2

6、+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2; 根据恒等定理得:x1=y2; y1=x2-(a/b)*y2; 这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.,工大ACM团队,扩展的欧几里德算法,int exGcd(int a, int b, int ,工大ACM团队,扩展的欧几里德算法的应用,POJ 1061-青蛙的约会 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位

7、置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。 我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。,工大ACM团队,POJ 1061,输入

8、只包括一行5个整数x,y,m,n,L,其中xy 2000000000,0 m、n 2000000000,0 L 2100000000。输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行Impossible,工大ACM团队,POJ 1061,Input 输入只包括一行5个整数x,y,m,n,L,其中xy 2000000000,0 m、n 2000000000,0 L 2100000000。Output 输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行ImpossibleSample Input 1 2 3 4 5 Sample Output 4,工大ACM团队,解题思路,此题其实就是扩

9、展欧几里德算法求解不定方程,线性同余方程。设过s步后两青蛙相遇,则必满足以下等式:(x+m*s)-(y+n*s)=k*l(k=0,1,2.)稍微变一下形得:(n-m)*s+k*l=x-y 令n-m=a,k=b,x-y=c,即a*s+b*l=c只要上式存在整数解,则两青蛙能相遇,否则不能。首先想到的一个方法是用两次for循环来枚举s,l的值,看是否存在s,l的整数解,若存在则输入最小的s,但显然这种方法是不可取的,谁也不知道最小的s是多大,如果最小的s很大的话,超时是明显的。,工大ACM团队,解题思路,求a * x + b * y = n的整数解。1、先计算Gcd(a,b),若n不能被Gcd(a

10、,b)整除,则方程无整数解;否则,在方程两边同时除以Gcd(a,b),得到新的不定方程a * x + b * y = n,此时Gcd(a,b)=1;2、利用上面所说的欧几里德算法求出方程a * x + b * y = 1的一组整数解x0,y0,则n * x0,n * y0是方程a * x + b * y = n的一组整数解;3、根据数论中的相关定理,可得方程a * x + b * y = n的所有整数解为: x = n * x0 + b * t y = n * y0 - a * t (t为整数)上面的解也就是a * x + b * y = n 的全部整数解。,工大ACM团队,解题思路,此时方程

11、的所有解为:x=c*k1-b*t。x的最小的可能值是0令x=0,可求出当x最小时的t的取值,但由于x=0是可能的最小取值,实际上可能x根本取不到0,那么由计算机的取整除法可知:由 t=c*k1/b算出的t,代回x=c*k1-b*t中。求出的x可能会小于0,此时令t=t+1,求出的x必大于0;如果代回后x仍是大于等于0的,那么不需要再做修正。,工大ACM团队,核心代码分析,while(scanf(%I64d%I64d%I64d%I64d%I64d, ,工大ACM团队,练习题,pku:1006, 1014, 1023, 1061, 1152, 1183, 1730, 2262, 2356, 1811,加 油!,湖南工业大学,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报