信息竞赛中的简单数学类问题及其数学构造方法.ppt
数学类问题数学类问题精度处理(高精度、实数处理)组合数学问题(Fibonacci数列、第二类数、卡特兰数、POLYA原理、排列组合计数、加法原理与乘法原理)进制问题(特定二进制串的统计、二分查找、利用二进制进行路径、状态描述、二进制转换)数学类问题数学类问题递推与递归关系(递推关系式、通项公式、数列、博弈问题)数位、数字、特定数值的查找、统计(数值处理、质因子分解、幂次分解、数值表达式、添加运算符、分式与实数运算)数学杂题(回文数字、矩阵处理、约瑟夫与反约瑟夫问题)数学剪枝(无解判定、解线性方程组、限定搜索范围)数学类问题的思维过程相关公式、定理、原理的应用寻找规律、归纳整理递归与递推关系式按照数学方法构造、二进制转化等技巧性处理注意事项:规律准确(小数据手工推算、搜索程序验证)数据类型是否合理、数据范围是否超界(大数据处理)整数划分问题(一)最优分解方案 将一个整数n分成若干个互不相同互不相同的数的和,使得这些数的乘积最大。其中1=n=1000。分析初看此题,最容易相到的算法是搜索,但此题的最大可以达到1000,搜索肯定会超时,而本题所给的限制条件也不多,即便是加上一些剪枝也起不到很好的效果。一般遇到这种情况我们可以从简单的数据分析起。在解一些问题的时候(特别是用数学方法解的问题),当我们无从解决时,可以从简单的数据考虑起,以便发现其中的一些规律,这种作法对解题是很有帮助的。n 分解方案 MUL 5 2,3 66 2,4 87 3,4 128 3,5 159 2,3,4 2410 2,3,5 30观察这几组数据,不难发现所有的分解方案的数的个数都等于可以分出的最多个数最多个数,其实我们并不难想到,要想使乘积最大,应尽量使分得的数多。另一方面,我们在初中数学中就已经证明过当数(正数)的和相等时,数的差越小,数的积也就越大,因此我们可以在分的数的个数最多的情况下使数之间的差尽量小差尽量小,这样得出来的方案必定是最优的。整数分划(二)例例题题2:若干个正整数之和为n,其中:n=1,j=1,2,,k,k=1 1=n1=n2=1,mN)初始(边界条件)为F(0,m)=1(m0)目标状态为F(N,N)。例题例题例题例题4 4:极值问题(最高时限15s)已知m、n为整数,且满足下列两个条件:m、n1,2,K,(1K109)(n 2mnm2)21编一程序,由键盘输入K,求一组满足上述两个条件的m、n,并且使m2n2的值最大。例如,若K1995,则m987,n1597,则m、n满足条件,且可使m2n2的值最大。【分析分析分析分析】方法一方法一从初等数学的角度考虑:由条件(n 2mnm2)21得出:n 2mnm2+1=0n 2mnm21=0根据求根公式N1,2(m1,2)/2 n3,4(m1,2)/2其中:1sqrt(5*m24);2sqrt(5*m24);【分析分析分析分析】再考虑条件。由于n1,因此排除了n3和n4存在的可能性.又由于n和m是整数,因此1和2应为整数。由于m2n2单调递增,从mk出发,按递减方向将m值代入n的求根公式。只要1(或2)为整数、n1(或n2)为整数且小于k,则得出的一组m和n一定使 m2n2的值最大。【算法描述算法描述】mk;while mi do begin 求1 if 1为整数 then begin 求n1;if(n1为整数)and(n1k)Then begin 输出m和n1;halt;end end;then 求2;if 2为整数 then begin 求n2;if(n2为整数)and(n2k)then begin 输出m和n2;halt;end end;then mml;end;while上述算法从数学意义上来说,是一定可以出得出正确解的。但是该算法疏漏了一个重要条件 1k109。如果K值超过105,上述算法不可能在限定的15秒内出解。【分析分析分析分析】方法二方法二分析小数据会发现:m,n是Fibonacci数列的相邻两项。因为:(n 2mnm2)2 1故:(m2+mn n 2)2 1又:m 2mnn2(mn)2mn2n2 (mn)2(mn)nn2 故:(m2mnn2)2(mn)2(mn)nn22 即:(n2mnm2)2(mn)2(mn)nn22【分析分析分析分析】由上述数学变换式可以得出,如果m和n为一组满足条件和条件的解,设nmn,m n那么n,m 也是一组满足条件和条件的一组解。将所有满足条件和条件的m和n 按递增顺序排成一个Fibomacci数列 1,1,2,3,5,8,数列中小于k的最大两个相邻数即为试题所要求的一组m和n。算法算法:利用Fibomacci数列顺推m,n,求出在条件范围内的m,n最大值,此时m2n2的值最大。例题例题例题例题5 5:Kathy函数函数(HNCOI)Tiger非常喜欢数学,所以他参加了学校组织的数学课外兴趣小组。在兴趣小组的学习当中,老师向Tiger介绍了Kathy函数,Kathy函数是这样定义的:例题例题例题例题5 5:Kathy函数函数(HNCOI)Tiger对Kathy函数产生了浓厚的兴趣,他通过研究发现有很多的数n都满足f(n)=n,对于一个给定的数m,他希望你求出所有的满足f(n)=n(n=m)的自然数n的个数,其中m=10100。组合计数Catalan数定义:一个凸n边形通过不相交于n边形内部的对角线把n边形拆分成若干三角形的不同拆分数。分析设Cn表示凸n边形的拆分方案总数。由题目中的要求可知一个凸n边形的任意一条边都必然是一个三角形的一条边,边P1 Pn也不例外,再根据“不在同一直线上的三点可以确定一个三角形”,只要在P2,P3,Pn-1点中找一个点Pk(1k=0的数列个数。Catalan数的应用(加括号)序列a1a2.ak的元素顺序保持不变,按不同结合方式插入合法圆括号对的方案数。n=4(a(bc)d)(a(b(cd)(ab)(cd)(ab)c)d)(a(bc)d)一个操作数序列,从一个操作数序列,从1,2,一直到,一直到n,栈,栈A的深度大于的深度大于n。现在可以进行两种操作:。现在可以进行两种操作:1将一个数,从操作数列的头端移至栈的头端(对应栈的将一个数,从操作数列的头端移至栈的头端(对应栈的push操作)操作)2将一个数,从栈的将一个数,从栈的头端移至输出序列的尾端(对应栈的头端移至输出序列的尾端(对应栈的pop操作)。使用这两种操作,由一个操作数序列就操作)。使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下表为由可以得到一系列的输出序列,下表为由1 2 3 生成序列生成序列2 3 1 的过程。的过程。步骤0123456操作数序列1232333栈1211311输出序列2223231Catalan数的应用(栈 NOIp2003)结合定义我们很容易能发现:如果进栈看成1,出栈看成0,在任何一位上累计的“0”的个数不大于累计的“1”的个数,因为必须在栈里有数的情况下才能向外弹数。原题转化为n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,“0”的累计数不大于“1”的累计数,求满足条件的数有多少。任务:你的程序将对给定的n,计算并输出由操作数序列1,2,n经过操作可能得到的输出序列总数。分析n个数,分别为1n,排成一个长度为n的排列。若每一个数的位置都与数的本身不相等,则称这个排列是一个错排。例如,n=3,则错排有231、312。编写程序,求n的错排个数。错排问题(经典问题)组合计数我们设k个元素的错位全排列的个数记做:W(k)。四个元素的错位排列W(4)我们用穷举法可以找到如下9个:(4,3,2,1)(3,4,1,2)(2,1,4,3)(4,1,2,3)(3,4,2,1)(3,1,4,2)(4,3,1,2)(2,4,1,3)(2,3,4,1)它们有什么规律呢?分析通过反复的试验,我们发现事实上有两种方式产生错位排列:A.将k与(1,2,k1)的某一个数互换,其他k2个数进行错排,这样可以得到(k1)W(k-2)个错位排列。B.另一部分是将前k1个元素的每一个错位排列(有W(k-1)个)中的每一个数与k互换,这样可以得到剩下的(k1)W(k-1)个错位排列。根据加法原理,我们得到求错位排列的递推公式W(k):W(k)=(k1)*W(k1)+W(k2)分析构造法 “构造法”解题,就是构造数学模型解决问题。包括直接构造问题解答的模型,图论模型,网络流模型以及组合数学模型。构造法解题的思路或步骤构造法解题的思路或步骤构造法解题的类型:构造法解题的类型:v直直接接构构造造问问题题解解答答。这只是构造法运用的一种简单类型。它只能针对问题本身,探索其独有性质,不具备可推广性。v数数学学建建模模。通过沿用经典的数学思想建立起模型;或者提取现实世界中的有效信息,用简明的方式表达其规律,这种规律可以是一条代数公式、一幅几何图形,一个物理原理、一个化学方程式,等等。无论是直接构造问题解答还是构造数学模型,都要通过算法实现。如何设计一个有较低编程复杂度和时空复杂度且结构清晰的算法,十分重要。通常考虑的因素有v选择的模型必须尽量多地体现问题的本质特征。但这并不意味着模型越复杂越好,累赘的信息会影响算法的效率。v模型的建立不是一个一蹴而就的过程,而是要经过反复地检验、修改,在实践中不断完善。v数学模型通常有严格的格式,但程序编写形式可不拘一格。利用数学方法进行构造例1:求Fibonacci数列 定 义:f0=f1=1,fn=fn-1+fn-2(n=2)。fi称 为Fibonacci数列。输 入 n,求 fn mod q。其 中 1=q=30000。n=109【解题分析】简单的模拟显然不能满足题目的要求,我们考虑构造解答。定义矩阵0111为A,发现(x,y)A=(y,x+y),恰好与数列性质相似。于是有,有(1,1)A=(1,2),(Fi,Fi+1)A=(Fi+1,Fi+Fi+1)=(Fi+1,Fi+2),即(1,1)An=(Fn,Fn+1)在(n)的时间内即可出解。例题2:毛毛虫是含N个节点的一棵树,它包含一条主链,所有点要么在链上,要么和主链上某点相邻。我们希望给毛毛虫的每个顶点标号1,2,3,N,使得所有边的两端节点标号差的绝对值恰好包含了1,2,3,N-1,每个数正好一次(N=10000)。815294863726358147这个题目初看上去,似乎无从下手。由于题目中所给的这种特殊的树以及顶点标号的约束条件都是我们以前没有见到过的,再加上数据的规模很大,最大可以达到N=10000。使得我们不得不朝着贪心或者构造的方向去思考。首先观察样例,再进行了一些尝试后,我们找到了对于样例的很多种合法的标号,其中有一种引起了我们的注意,如下图所示:19234876512345678很容易发现,图中边的权值,也就是边的两端顶点标号差的绝对值,是从左向右依次递减的。这个发现使我们不由得想到,是不是对于所有的毛毛虫都存在一种这样的合法标号方式。例题分析一序列(见文本)利用图论模型进行构造例题3:圆桌吃饭问题 n个人围着一张圆桌吃饭,每个人都不愿意两天与同一人为邻,问最多能坐多少天,并给出一种排列方案?转化为图论模型 设G=(V,E)为一完全图,|V|=n。图中的每个顶点代表一个人,连结顶点的边表示人之间的相邻关系。因此,每种围绕圆桌的吃饭方案就成为图中的一条哈密尔顿回路。设L=为G中的一条哈密尔顿回路,其中所含的边的集合记为e(L)。问题转化为:求m与L1,L2,Lm,使得e(Li)e(Lj)=,并且m达到最大值。构造方法 作一圆,把圆周分成n-1等分,标上n-1个刻度,将顶点1至n-1依次排列在圆周上,顶点n放在圆心。先从圆心出发,向任意点连一条线,再从这点出发,沿圆周向左右两个方向迂回连线,直到连完圆周上所有的点,再连回圆心。这样就构造出一条哈密尔顿回路。保持所有的顶点位置不变,把所有连线围绕圆心逆时针方向旋转一个刻度,得到一条新的哈密尔顿回路。这样连续旋转(n-1)div 2次,就得到了(n-1)div 2条回路。N=5当n=5时构造图象,充分展示各变量之间的关系构造图象,充分展示各变量之间的关系【例二】01串问题(NOI99)给定N,L0,A0,B0,L1,A1,B1,设计一个长度为N的01串,使得对于任何连续的长度为L0的子串,0的个数大于等于A0,且小于等于B0,对于任何连续的长度为L1的子串,1的个数大于等于A1且小于B1。【解题分析】模式1分析不等式设hi为01子串s0.si(1=I=n)中1的个数,其中s0=0,h0=0。显然,由hi的定义可以得出不等式0=hi-1=hi,hi=hi-1+1,移项即得:0=hi-hi-1-1=hi-1-hiL0-b0=L0时,根据条件,Si-L0+1Si中0的个数(L0-(hi-hi-L0)在a0b0之间,即a0=L0-(hi-hi-L0)=b0a0-L0=hi-L0-hi-b1=L1时,根据条件,Si-L1+1Si中1的个数(hi-hi-L1)在a1b1之间,即a1=hi-hi-L1=b1。a1=hi-hi-L1一旦有了h序列,我们可以由左至右构造s串:如果hi-1=hi,则说明si=0;否则si=1(1=I=n)。由此看来,问题的关键是如何计算h序列。仔细观察上述推论条件,发现有以下特点:(1)除h0=0外,其余的条件都是由“=”连接的不等式(2)每个不等式都是含两个h未知数、一个常数的一次不等式;可见,所有不等式都整理成了k=hi-hj它给我们启示,上述不等式类似于连接两点的一条有向边。因此,我们联想到信息学解题中常用的图论知识。模型2构造有向图G我们构造有向图G,如图:其中vi代表s串中的第I位。若k=vi-vj,则vi向vj引出一条权为k的有向边,表明sisj中至少需增加k个1(k为正值)或减少k个1(k为负值)。由此得出构造有向图G的方法:0=hi-hi-1-1=hi-1-hia0-L0=hi-L0-hiL0-b0=hi-hi-l0a1=hi-hi-L1-b1=hi-l1-hi计算图G的最长路径:我们已构造了一个有n+1个顶点的有向图G。(1)图G中无环令DI表示从顶点0到顶点I的最长路径长度。对于图中每条从点I指向点J的权为CI,J的边,有性质DI+CI,J=DJ(注意:这与上述不等式的形式相似)这样,令hi=DI,h完全符合所有限制条件,即为原不等式组的一组解。(2)G中含有环可用反证法证明无解。从s1出发,顺序确定每位二进制数。当hi=hi-1时,说明s1si-1中1的个数与s1si中1的个数相同,即si为0;否则si为1。