收藏 分享(赏)

离散数学在信息学竞赛中的运用.ppt

上传人:qcjlxh 文档编号:5317964 上传时间:2019-02-20 格式:PPT 页数:87 大小:415KB
下载 相关 举报
离散数学在信息学竞赛中的运用.ppt_第1页
第1页 / 共87页
离散数学在信息学竞赛中的运用.ppt_第2页
第2页 / 共87页
离散数学在信息学竞赛中的运用.ppt_第3页
第3页 / 共87页
离散数学在信息学竞赛中的运用.ppt_第4页
第4页 / 共87页
离散数学在信息学竞赛中的运用.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

1、离散数学在信息学竞赛中的运用,Yellow Vigorous Pine,目录,重集全排列 Catalan数 简单数论 矩阵的简单运用 棋盘多项式与任务分配 置换群与plya定理,重集全排列,一般我们认为排列或组合的元素必须两两相异,现取消这一限制。例如一个排列可以是aaaaabbbbbaaaabbbb等等,一个组合可以只a,a,b,b。对于重集Sp1a1,p2a2pkak,其中pi表示ai在集合中的个数。那么这个重集的全排列个数是(Pi)!/(Pi!),其中(i=1 to k)。,字符串序号,字符串 acab 含有两个 a ,一个 b ,一个 c ,和 acab 含的字母和每个字母的个数都相等

2、的字符串还有:aacb,baca等,因为他们也是含有两个 a ,一个 b ,一个 c 。所有满足这个性质的字符串按字典顺序排列后,acab 是第 5 个,我们就说 acab 的序号是 5 .再如:ba 的序号是 2,aa 的序号是 1.编程求出给定字符串 S(长度=100) 的序号 P(保证=30000)注意:字符串只含小写字母。 本题可以逐位利用重集全排列的公式,计算出解。,飞行问题,在nmk一只飞蛾从空间上的(0,0,0)点飞到(n,m,k)点,规定飞蛾每次只能向右,向前,向下飞行一单位距离,问飞蛾有多少种不同的路径可以飞到终点。 向右飞行计为a,向前计为b,向下计为c。那么每一个飞行过程

3、就对应着一个多个a多个b多个c的排列,反之也对应。而a有n个,b有m个,c有k个。所以这些字母全排列的个数对应着飞行路径的个数(m+n+k)!/m!n!k!。,Catalan数,堆栈问题 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。 考虑这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n。,Catalan数,现在可以进行两种操作: 1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作) 2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作) 使用这两种操作,由一个操作数序列就可

4、以得到一系列的输出序列。 例如1 2 3 4 5为初始序列,经过进栈,出栈,进栈,进栈,进栈,出栈,进栈,出栈,出栈操作后,序列变为了1 4 5 3 2,Catalan数,试问一个序列1n经过堆栈处理之后,有多少种出栈序列。 要知道这个问题如何解决,先将这个问题的模型转换一下。进栈时,我们在纸上画一个左括号,出栈时,画一个右括号。这样就把整个进栈出栈的过程转化成了一个括号序列。而且任何一个进栈出栈的过程都对应着唯一的括号序列。,Catalan数,好括号列的定义:(1)空列是好括号列。(2)若A和B是好括号列,则AB是好括号列。(3)若A是好括号列,(A)是好括号列。 由好括号的定义可知,任何一

5、个进栈出栈过程转化成的括号序列都是好括号列。那么任何一个好括号列也对应着一个唯一的进栈出栈过程。计算出长度为n(n为完整括号个数,一个左括号加上一个右括号算作一个完整括号)的好括号列的个数也就是计算出了堆栈问题的答案。 经过数学证明,长度为n的好括号列的个数是C(n)C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)。这个数被称为Catalan数(卡特兰数)。,Catalan数,考虑新X1X2X3Xn,对这个乘式加括号搞结合律,则共加n-1个括号,那么添加括号的方案数是C(n1)种。若最后一次乘法是(X1,X2Xk)(Xk+1,Xk+2Xn),那么组合方式也是相乘的(乘法原理),设

6、前k个元素的填括号方式有a(k)种,后面的n-k个元素有a(nk)种,则a(n)=a(k)a(n-k),其中k1 to n-1,a1=1。这就是Catalan数的递推公式。 由上述的递推公式可以知道,包含n个结点的二叉树有C(n)棵。,小结,可以运用Catalan数的地方: 设圆周上2n个点,用n条彼此在圆内部无公共交点的弦连接这些点,共有C(n)种连接方式。 在nn的矩阵中,从(0,0)点走到(n,n)点,规定只能向下或向右走,且不能穿过左上到右下的对角线,共有C(n)种走的方式。 填括号问题 进栈出栈问题 结点数是n的二叉树的个数,数论,这里简要介绍一些实用的数论算法。 求最大公约数(欧几

7、里德算法) Function gcd(a,b:longint):longint; Beginif a mod b=0 then gcd:=b else gcd:=gcd(b,a mod b); End; 这里,调用gcd(a,b)函数可以求出a和b 的最大公约数。,欧几里德算法,狼找兔子 一座山周围有n个洞,顺时针编号为0,1,2,n-1。而一只狼从0号洞开始,顺时针方向计数,每遇到m个洞就进洞找兔子。例如n=5,m=3,狼经过的洞依次为0,3,1,4,2,0。输入n和m。试问兔子有没有幸免的机会,如果有,该藏在哪儿?,狼找兔子,不妨让兔子躲在1号洞,因为若狼能从0号洞到达1号洞,则必能从1号

8、洞到达2号洞,兔子难逃厄运。反过来说,若有安全洞,则1号洞就是其中一个。 再来看狼的运动。狼的第i次运动后的洞址应该是(mi) mod n。若(mi) mod n=1,即狼第i次运动后到达1号洞,则gcd(m,n)=1。因为若gcd(m,n)=k1,则由(mki) mod (nk)=1,设mk=m,nk=n,mki-(mki) / (nk) nk=1。得出1/k是整数,与k1矛盾。所以当gcd(n,m)=1时,兔子无法幸免。反之,兔子应该选择除了igcd(m,n)|i=0(n/gcd(m,n)-1)外的洞躲藏。,扩展欧几里德算法,下面,我们对欧几里德算法进行推广,使得该算法不仅能得出任意两个正

9、整数a和b的最大公约数d,而且还能计算出满足下式的整系数x和y。 D=gcd(a,b)=ax+by(x和y可能为0或负数),扩展欧几里德,Function euclid(a,b:longint; var x,y:longint):longint; Var t:longint; Beginif b=0 then begineuclid:=a; x:=1; y:=0;end Elsebegineuclid:=euclid(b,a mod b,x,y);t:=x; x:=y; y:=t-(a div b)*y;end; End;,扩展欧几里德算法,上述函数是从欧几里德算法中衍生出来的。算法一开始,它

10、首先测试b=0,若b=0,返回当前最大公约数a,x=1,y=0,以使a=gcd(a,0)=a*1+b*0;若b0,则欧几里德算法首先计算出d=gcd(b,a mod b) = bx+(a mod b)*y中的x和y。在这种情况下,d=gcd(a,b)=d=gcd(b,a mod b)。为了得到d=ax+by的x和y,我们利用等式d=d=bx+(a mod b)y得出d=bx+(a-(a div b)b)y=ay+b(x-(a div b)y)。因此,x=y; y:=x-(a div b)*y。,解的个数,已知x,y满足如下条件: ax+by+c=0 ; x1=x ; x=x2 ; y1=y ;

11、 y=y2 ; x,y均为整数。 其中:a,b,c,x1,x2,y1,y2都是绝对值不超过108的整数。 求(x,y)的解的个数。 输入:a,b,c,x1,x2,y1,y2 输出:输出解的个数 样例输入 1 1 1 -10 10 -9 9 样例输出 19,解的个数,直接的枚举显然是不符合时间要求的。由于方程所有解之间的关系是可以互相推导的,所以如果我们已知了方程的一个解,那么用数学方法推导出其他的解,继而统计解的个数。 所以在求解方程的任意一个解的时候,我们可以用到扩展的欧几里德算法。,素数的测试,刚刚接触信息学的时候,可能就做过关于素数测试的题目,当时的方法是2-sqrt(n)的枚举,这样的

12、效率并不高。 欧拉定理:a(n) 1(mod n),其中(n) 是n的欧拉函数,(n) 不大于n的但与n互质的正整数个数。a可以取任意值。 易知,(素数n)=n-1,费尔马小定理,从而,当n是质数的时候,an1 1(mod n),这是欧拉定理的特殊情况,也称为费尔马小定理。 那么,费尔马小定理的逆定理是否成立呢?答案是否定的,但是这种情况很少。也就是说,对于a取1n-1的任意一个值的时候,都有an1 1(mod n)成立的话,则几乎可以可定地确认n是素数。,费尔马小定理,当a=2时,小于104的n值中,只会产生22个不成立的n。当a3时,在小于108地n值中,只会产生255个不成立的n。 显然

13、可以看出这个出错的概率是很小的。 我们用分治法,可以在klogN的复杂度内判断N是否为素数。其中k是a的取值次数。一般情况下,我们只需要让a=2,3,4判断一下就可以了。 于是费尔马小定理的逆定理成为了我们进行素数测试的有效算法之一。,选数,选数(Noip2002普及组)已知n个整数x1,x2,xn,以及一个整数k(kn)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34,选数,现在,要求你计算出和为素数共有多少种。 输入

14、格式为: n,k (1n20,kn) x1,x2,xn (1xi5000000) 一个整数(满足条件的种数)。 样例输入: 4 3 3 7 12 19 样例输出:1,选数,这一题采取的是搜索的算法,这已经是十分低效的了,但是还得加上素数判定的复杂度,所以这里采取费尔马小定理的逆定理判定素数才能使得整个程序在短时间内出解。,小结,关于数论的一些知识本人还十分缺陷,所以只能做一些简单知识的介绍。,矩阵的简单运用by 韩文弢,由m行、n列的标量所构成的数组被称为一个mn的矩阵(matrix)。 一般用大写字母表示矩阵,对应的小写字母表示矩阵中的项(entry)。 这里,aij就是矩阵A中第i行第j列的项。,矩阵的乘法,设A=(aij)mn,B=(bij)np是两个矩阵,矩阵C=AB,则C是一个mp的矩阵,且其中第i行第j列的项的值为A中第i个行向量与B中第j个列向量的内积。 也就是说,,矩阵乘法举例,矩阵乘法的应用,求无权图中长度为k的路径数,矩阵乘法运算的性质,不满足交换律 AB=BA不一定成立 满足结合律 (AB)C=A(BC)成立 满足分配律 A(B+C)=AB+AC成立(左分配律) (A+B)C=AC+BC成立(右分配律),例题1:递推数列(recurrence),1k100,0n1,000,000,

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

当前位置:首页 > 中等教育 > 职业教育

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


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

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

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