超难奥数题之数论专题:穷举用技巧
- 格式:doc
- 大小:245.50 KB
- 文档页数:2
第三讲穷举法一、穷举法的基本概念穷举方法是基于计算机特点而进行解题的思维方法。
一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。
这样解决问题的方法我们称之为穷举算法。
穷举算法特点是算法简单,但运行时所花费的时间量大。
有些问题所列举出来的情况数目会大得惊人,就是用高速的电子计算机运行,其等待运行结果的时间也将使人无法忍受。
因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。
二、穷举算法模式穷举算法模式:(1)问题解的可能搜索的范围:用循环或循环嵌套结构实现(2)写出符合问题解的条件。
(3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。
三、使用穷举法设计算法穷举法应用很多,比如一些密码破译软件通常就是用的穷举算法。
如在QQ上,OicqPassOver这个工具穷举你的口令,它根据机器性能最高可以每秒测试20000个口令,如果口令简单,一分钟内,密码就会遭到破译。
下面我们来以三个例子说明穷举法的具体应用。
实例一:古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。
分析:(1)本题是一个搜索问题,搜索范围 2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数据的本身。
(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和。
程序如下:Program p3_1 ;Var a , b,s :integer ;BeginFor a:=2 to 1000 doBeginS:=0 ;For b:=1 to a -1 doIf a mod b =0 then s:=s+b ; { 分解因子并求和 }If a=s then beginWrite( a, ‘=’ ,1, );For b:=2 to a -1 doIf a mod b=0 then write( ’+’, b );Writeln ;End;End;End.当程序运行后,输出结果:6 = 1 + 2 + 328 = 1 + 2 + 4 + 7 + 14496 =1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248实例二:(第七届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题)在A,B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。
穷举算法及解题穷举算法及解题例12-1 古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。
问题分析(1)本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数的本身;(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。
程序如下:program p12_1;var a,b,s:integer;beginfor a:=2 to 1000 dobegins:=0;for b:=1 to a-1 doif a mod b =0 then s:=s+b;if a=s then beginwrite(a,'=',1,);for b:=2 to a-1 doif a mod b=0 then write('+',b);writeln;end;end;end.当程序运行后,输出结果:6=1+2+328=1+2+4+7+14496=1+2+4+8+16+31+62+124+248例12-3邮局发行一套票面有四种不同值的邮票,如果每封信所帖邮票张数不超过三枚,存在整数r,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3、……、r来,找出这四种面值数,使得r值最大。
问题分析:本题则是知道每封信邮票数的范围(<=3),邮票有四种类型,编程找出能使面值最大邮票。
其算法是:(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;(2) 用这四种邮票贴出连续的整数,并且使r值最大;(3) 用穷举法,找出所有符合条件的解;(4) 本题用集合的方法统计邮票的面值,提高判重的速度。
设四种邮票的面值分别为:a,b,c,d,根据题意设:a<b<c<d,因此a=1,用循环语句完成搜索。
第16章 穷举算法与实验穷举方法是基于计算机特点而进行解题的思维方法。
一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。
这样解决问题的方法我们称之为穷举算法。
穷举算法特点是算法简单,但运行时所花费的时间量大。
因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。
虽然穷举法效率并不高,但是适应一些没有明显规律可循的问题的解决。
因为穷举算法就是从所有可能的情况中搜索正确的答案,所以一般可按如下步骤: 第1步: 对于一种可能的情况,列举出来并计算其结果;第2步:判断结果是否满足要求,如果不满足则执行第1步来搜索下一个可能的情况,如果满足要求,则表示寻找到一个正确的答案,执行下一步操作,如寻找其他正确(合适)的答案或者中断循环。
16.1三角形数问题16.1.1 问题描述将 ,F ,E ,D ,C ,B ,A 这六个变量排成如图所示的三角形,这六个变量分别取[1,6]上的整数,且均不相同。
求使三角形三条边上的变量之和相等的全部解。
如图就是一个解。
A 6B C 3 1D F 2 4E 516.1.2 问题分析程序引入变量123456,,,,,i i i i i i ,代表,F ,E ,D ,C ,B ,A 并让它们分别顺序取1至6的正整数,在它们互不相同的前提条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。
当这些变量取尽所有的组合后,程序就可得到全部可能的解。
细节见下面的程序。
【程序1】%穷举法解三角形数 for i1=1:6 for i2=1:6 if i1==i2 continue;endfor i3=1:6if i1==i3 || i2==i3continue;endfor i4=1:6if i1==i4 || i2==i4 || i3==i4continue;endfor i5=1:6if i1==i5 || i2==i5 || i3==i5 || i4==i5continue;endfor i6=1:6if i1==i6 || i2==i6 || i3==i6 || i4==i6 || i5==i6continue;endif i1+i2+i4==i1+i3+i6 && i1+i2+i4==i4+i5+i6fprintf ('%6d\n',i1) ;fprintf ('%4d%4d\n',i2,i3) ;fprintf ('%2d%4d%4d\n\n',i4,i5,i6) ;endendendendendendEnd16.1.3 问题讨论按穷举法编写的程序通常不能适应变化的情况。
常⽤算法-穷举法穷举法⼜称为枚举法,它是在计算机算法设计中⽤得最多的⼀种编程思想。
它的实现⽅式是:在已知答案范围的情况下,依次地枚举该范围内所有的取值,并对每个取值进⾏考查,确定是否满⾜条件。
经过循环遍历之后,筛选出符合要求的结果来。
这种⽅法充分利⽤了计算机运算速度快的特点,思路简单直接,能够解决⼤部分的问题。
什么样的问题适合使⽤穷举法来解决呢?归纳起来,遇到了如下的三种情况,将优先考虑使⽤穷举法:1. 答案的范围已知:虽然事先并不知道确切的结果,但能预计到结果会落在哪个取值范围内。
譬如说:①求1-100之间所有的素数:⽆论结果如何,都在1-100的范围之内。
②求2000-2015年间有⼏个⽉的13号是周⽇?这15年间共有180个⽉,⽉份的个数最多不会超过180③验证1000以内的哥德巴赫猜想:即找出1000之内所有的合数,看是否能够分解为两个质数之和。
如果仔细观察,将会发现许多题⽬的结果范围都是已知的,都可以使⽤穷举法来实现。
2. 答案的结果是离散的,不是连续的。
如果要求出1-2之间所有的⼩数,就⽆法⽤穷举法来实现,因为其结果是⽆限连续的。
3. 对时间上的要求不严格。
蓝桥杯⽐赛中的许多题⽬对于算法的设计是有时间要求的,有时会⾮常苛刻。
如果⽤穷举法则耗时过长,不可取。
例如求出21位的⽔仙花数,使⽤穷举法可能会花费30分钟的时间。
⽽蓝桥杯试题通常要求时间限制在1秒钟之内完成,少数会延长⾄3分钟。
在这种情况下,必须使⽤新的算法来解决问题。
下⾯举个经典的例⼦:100块砖100⼈来搬,男⼈⼀⼈搬4块,⼥⼈⼀⼈搬3块,⼩孩3⼈抬⼀块,问男,⼥,⼩孩各⼏⼈?若设男,⼥,⼩孩⼈数分别为X, Y, Z,则只能够列出两个等式: X+Y+Z=100 4*X+3*Y+Z/3=100 。
三个未知数两个等式,⽆法求解。
这就只能够使⽤穷举法来实现,具体做法如下:先确定每种类型⼈员的数量的取值范围,由题意可知,男⼈X的取值范围是0~100/4=25 ⼥⼈Y的取值范围是0~100/3=33 ⼩孩的取值范围是0~99(必须不⼤于100且为3的倍数)。
穷举算法穷举算法有点像数学上说的"完全归纳法",在问题答案可能的全部解集内逐一查询(测试)直到找出答案为止。
穷举算法的模式:⑴问题解的可能搜索的范围:用循环或循环嵌套结构。
⑵写出符合问题解的条件。
⑶能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。
用穷举算法解决问题,通常可以从两个方面进行分析:一、问题所涉及的情况:问题所涉及的情况有哪些,情况的种数可不可以确定。
把它描述出来。
二、答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。
把这些条件描述出来。
练习试题第一题:36 块砖, 36 人搬。
男搬 4 ,女搬 3 ,两个小儿抬一砖。
要求一次全搬完。
问需男、女、小儿各若干?第二题: A 、 B 、 C 、 D 、 E 五人夜间合伙捕鱼,凌晨时都疲倦不堪,各自在河边的树丛中找地方睡着了。
日上三竿, A 第一个醒来,他将鱼分作五份,把多余的一条扔回河中,拿自己的一份回家去了。
B 第二个醒来,也将鱼分作五份,扔掉多余的一条,拿走自己的一份,接着 C 、 D 、 E 依次醒来,也都按同样的办法分鱼,问五人至少合伙捕了多少条鱼?试编程序算出。
第三题:古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2-1000内的所有完全数。
第四题:一根29CM长的尺子,只允许在上面刻7个刻度,要能用它量出1-29CM的各种长度。
试问这根尺的刻度应该怎样选择?算法分析:⑴对于每一组刻度的选择都需要判断是否能将1-29CM的各种刻度量出来,例如选择的刻度为:a1、a2、a3、a4、a5、a6、a7,那么能量出的刻度为:a1a2a3a4a5a7a1,29- a1;2 a2,a2- a1,29- a2;3 a3,a3- a1,a3- a2,29- a3; 4 a4,a4- a1,a4- a2,a4- a3,29- a4;5 a5,a5- a1,a5- a2,a5- a3,a5- a4,29- a5;6 a6,a6- a1,a6- a2,a6- a3,a6- a4,a6- a5,29- a6;7 a7,a7- a1,a7- a2,a7- a3,a7- a4,a7- a5,a7- a6,29- a7;8共可量出2+3+4+5+6+7+8种刻度,即35种刻度,事实上其中有许多刻度是重复的,不可能覆盖1-29。
6种方法教你轻松解决奥数难题名师指点
在学奥数的时候要善于总结规律,就像任何绝妙的武功都会有几句要诀一样,再难的奥数题也离不开以下6种常用解法:
1 、直观画图法:解奥数题时,如果能合理的、科学的、巧妙的借助点、线、面、图、表将奥数问题直观形象的展示出来,将抽象的数量关系形象化,可使同学们容易搞清数量关系,沟通已知与未知的联系,抓住问题的本质,迅速解题。
2 、倒推法:从题目所述的最后结果出发,利用已知条件一步一步向前倒推,直到题目中问题得到解决。
3 、枚举法:奥数题中常常出现一些数量关系非常特殊的题目,用普通的方法很难列式解答,有时根本列不出相应的算式来。
我们可以用枚举法,根据题目的要求,一一列举基本符合要求的数据,然后从中挑选出符合要求的答案。
4 、正难则反:有些数学问题如果你从条件正面出发考虑有困难,那么你可以改变思考的方向,从结果或问题的反面出发来考虑问题,使问题得到解决。
5 、巧妙转化:在解奥数题时,经常要提醒自己,遇到的新问题能否转化成旧问题解决,化新为旧,透过表面,抓住问题的实质,将问题转化成自己熟悉的问题去解答。
转化的类型有条件转化、问题转化、关系转化、图形转化等。
6 、整体把握:有些奥数题,如果从细节上考虑,很繁杂,也没有必要,如果能从整体上把握,宏观上考虑,通过研究问题的整体形式、整体结构、局部与整体的内在联系,只见森林,不见树木,来求得问题的解决。
穷举策略前面几节我们看到,在问题的解可以用公式,或者按一定的规则、规律求出时,只要把这些规则用计算机的语言写出,问题就可以得到解决。
但也有些问题一时难以找到规律或公式,或者根本没有公式可循,这种情况下,我们可以利用计算机高速运算的特点,用穷举策略来解。
所谓穷举策略,原则上说,就是第一步只考虑问题的部分条件,根据这些条件,找到所有的满足这些部分条件的解,称为可行解。
然后用尚未考虑的条件去一一检验那些可行解,删去不符合条件的解,留下符合条件的解,就是整个问题的解。
【例题5-1】如图所示的8个格子中放入1~8八个数字,使得相邻的和对角线的数字之差不为1。
编程找出所有放法。
我们先不考虑后一条件,只考虑第一个条件,即把1~8八个数字放入8个格子中。
这是容易做到的,就是8个数字的全排列,共有 8!=40320种放法。
然后对这8!个可行解用后一个条件加以检验,输出符合条件的解。
对于后一个条件中“相邻”的判断,可以建立一个邻接表来解决:i│ 1 2 3 4 5 6 7 8 9 10 11 12 13 14──┼──────────────────────j 1│ 1 1 1 2 2 2 3 3 3 4 5 5 6 72│ 2 3 4 3 5 6 4 6 7 7 6 8 7 8表中表示哪两个格子是相邻的,link[i,1]和link[i,2]是相邻的格子的编号。
全排列的产生,可以用八重循环,也可以用专门的算法,程序留给同学们自己去完成。
利用穷举策略编制的程序,其运算量一般是很大的,因此如何提高算法效率是穷举算法一个很重要的问题。
一般应尽量减少可行解的个数,使得第二步的检验运算量尽可能地少。
例如对于例5-1,如何来优化算法呢?如果注意到b3和b6两个格子,与它们“相邻”的格子有6个,也就是说,放入这两个格子中的数,必须和6个数不连续,仅可以和一个数是连续的,这样的数只有2个,即1和8。
这样,b1,b3,b6,b8 4个格子中数的放法仅有两种可能:2、8、1、7和7、1、8、2。
穷举用技巧
【例1】
N是一个各位数字互不相等的自然数,它能被它的每个数字整除。
N的最大值是。
【例2】
如果连续N个自然数,每个自然数的数字和都不是11的倍数,则称这连续的N个自然数为一条“龙”,n为这条龙的长度。
比如1,2,3,…,28就是一条龙,它的长度是28。
问:龙的长度最长可以为多少?写出一条最长的龙。
【例3】
黑板上写有1、2、3、……、100这100个自然数,甲、乙二人轮流每次每人划去一个数,直到剩下两个数为止。
如剩下的两数互质则判甲胜,否则判乙胜。
⑴乙先划甲后划,谁有必胜策略?必胜策略是怎样的?
⑵甲先划乙后划,谁有必胜策略?必胜策略是怎样的?
【例4】
如果一个自然数的2004倍恰有2004个约数,这个自然数自己最少有多少个约数?
测试题
【例1】求所有能被30整除,且恰有30个不同约数的自然数。
【例2】在1到100中,恰好有6个约数的数有多少个?
答案:
【例1】【分析】
由于30235=⨯⨯,从质数的观点看整除,如果自然数N 能被30整除,那么自然数N 至少含有三个质因数2,3,5。
设:312235r r r N =⨯⨯⨯。
自然数N 恰有30个不同的因数,根据约数的个数公式:12311130235r r r +⨯+⨯+⨯==⨯⨯()()()。
注意
到235⨯⨯是三个约数之积,由此可知自然数N 中质因数的个数恰好有3个。
因此
123111235r r r +⨯+⨯+=⨯⨯()()(),由此可知123r r r (,,)必是
124(, , )的一个排列。
综上所述,所求的自然数有:24235⨯⨯,42235⨯⨯,24235⨯⨯,42235⨯⨯,42235⨯⨯,24235⨯⨯。
【例2】【分析】
6只能表示为()51+或()()1121++,所以恰好有6个约数的数要么能表示成某个质数的5次方,要么表示为某个质数的平方再乘以另一个质数,100以内符合前者的只有32,符合后者的数枚举如下:
222222222222222232527211213217219223
8323537311
45253
2721⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯种种种种 所以符合条件的自然数一共有1842116++++=(种)。