ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:27.53KB ,
资源ID:30671446      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30671446.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数学问题.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数学问题.docx

1、数学问题9.1 多项式展开系数源程序名 equal.?(pas, c, cpp)可执行文件名 equal.exe输入文件名 equal.in输出文件名 equal.out【问题描述】 二项式展开系数大家已经十分熟悉了: n!C=(i!*(n-i)!) 现在我们将问题推广到任意t个实数的和的n次方(x1+x2+xt)n的展开式。我们想知道多项式(x1+x2+xt)n中的任意一项x1n1x2n2xini的系数。例如,将一个三项式(x1+x2+x3)3展开后,可以得到:(x1+x2+x3)3=x13+x23+x33+3x12x2+3x12x3+3x1x22+3x1x32+3x22x3+3x2x32+

2、6x1x2x3 其中, x21x2的系数为3【输入】 第一行,两个整数n和t,中间用空格分隔。分别表示多项式幂和项数。 第二行,t个整数n1, n2, , nt,中间用空格分隔。分别表示x1, x2, , xn的幂。(n1+n2+nt=n,1n, t12)【输出】 仅一行,一个整数(保证在长整型范围内)。表示多项式(x1+x2+xt)n中的项x1n1x2n2xtnt的系数。【样例】 equal.in equal.out 3 3 3 2 1 0【知识准备】 组合数运算; 二项式展开; 代数式的恒等变形。【算法分析】我们可以从二项式定理推广到多项式定理,得出系数的通项公式为n!/(n1!n2!nt

3、-1!nt!)【参考程序】program gdjk;var i,n,t,sum:longint; f:array0.12of longint; c:array1.12of longint;beginassign(input,equal.in);reset(input);assign(output,equal.out);rewrite(output); f0:=1; for i:=1 to 12 do/计算112的阶乘 fi:=fi-1*i; readln(n,t); for i:=1 to t do read(ci); sum:=fn; for i:=1 to t do sum:=sum di

4、v fci;/求系数 writeln(sum);close(input);close(output);end.9.2 两数之和 源程序名 pair.?(pas, c, cpp)可执行文件名 pair.exe输入文件名 pair.in输出文件名 pair.out【问题描述】 我们知道从n个非负整数中任取两个相加共有n*(n-1)/2个和,现在已知这n*(n-1)/2个和值,要求n个非负整数。【输入】 输入文件仅有一行,包含n*(n-1)/2+1个空格隔开的非负整数,其中第一个数表示n(2n10),其余n*(n-1)/2个数表示和值,每个数不超过100000。【输出】 输出文件仅一行,按从小到大的

5、次序依次输出一组满足要求的n个非负整数,相邻两个整数之间用一个空格隔开;若问题无解则输出“Impossible”。【样例】 pair.in pair.out 3 1269 1160 1663 383 777 886【算法分析】此题一眼看到会觉得没有任何思路,唯一的想法就是搜索,结果证明这一想法是正确的。我们应该先求出最小数,因为最小数求出来以后,第二小的数,第三小的数,都求出来的,但如何求最小数呢?我们先将序列从小到大排序,枚举1a1中的所有数设为最小数f1,再一个一个求出其他数如何求其他数呢,我们这样想,数列a中第二小的数一定是a2=f1+f2,于是f2=a2-f1,同理f3=a3-f1,将

6、f1f3产生的和从数组a中去除,在重复以上过程【参考程序】program fjl;type arr=array1.45of longint;var n,i,j,s,k,l,t:longint; a,f,b:arr; q,p:boolean;procedure sort(var a:arr);var i,j,t:longint;begin for i:=1 to s-1 do for j:=1 to s-i do if aj+10 then bfind(f2+f3):=0 else continue; t:=3; repeat sort(b); for j:=3 to s do if(bj0)t

7、hen begin inc(t); ft:=bj-f1; bj:=0;/删去bj p:=false; for l:=2 to t-1 do if find(fl+ft)0 then bfind(fl+ft):=0 else begin p:=true;/不成立 break; end; end; if p then break;/当前数不成立 until(fn0)or(p=true); if(fn0)and(not p)then begin q:=true; for l:=1 to n-1 do/输出解 write(fl, ); writeln(fn); close(input); close(

8、output); halt; end; end; if not q then writeln(Impossible);/无解close(input);close(output);end.9.3 盒子与球源程序名 box.?(pas, c, cpp)可执行文件名 box.exe输入文件名 box.in输出文件名 box.out【问题描述】 现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。问有多少种方法? 例如:有2个不同的盒子(分别编为1号和2号)和3个不同的球(分别编为1、2、3号),则有6种不同的方法:1号盒子 1号球 1、2号球 1、3号球 2号球

9、2、3号球 3号球2号盒子 2、3号球 3号球 2号球 1、3号球 1号球 1、2号球【输入】 两个整数,n和r,中间用空格分隔。(0n, r10)【输出】 仅一行,一个整数(保证在长整型范围内)。表示n个球放入r个盒子的方法。【样例】 box.in 3 2 box.out 6【知识准备】 第二类Stirling数。【算法分析】 先考虑三种情况: (1)若盒子数r大于球数n,根据题意不允许有空盒的要求,放置的方法数为零; (2)若r1,则只有一种放法; (3)若rn,相当于将n个不同的球进行排列,故有n!种。 下面考虑1r1, r1) 证明:设n个不同的球为b1, b2, , bn,从中取一个

10、球设为b1。把这n个球放入r个盒子无一空盒的方案全体可分为两类: (1)b1独占一盒,其余n-1个球放入r-1个盒子无一空盒的方案数为S(n-1,r-1) (2)b1不独占一盒,这相当于先将b2, b3, , bn。这n-1个球放入r个盒子,不允许有空盒的方案数共有S(n-1, r),然后将b1放入其中一盒,这一盒子有r种可挑选,故b1不独占一盒的方案数为rS(n-1, r)。 根据加法原理,则有: S(n, r)rS(n-1, r)+S(n-1, r-1)(n1,r1) 对于nr,或r1,显然有S(n, n)1,S(n, 1)1。综上所述,本题的算法可用第二类Stirling数的递推关系先求

11、出S(n, r),再乘上r!,即得所求方案数。【参考程序】program fgduif;var n,r,j,i:longint; s:array0.20,0.20of longint;beginassign(input,box.in);reset(input);assign(output,box.out);rewrite(output); fillchar(s,sizeof(s),0); readln(n,r); for i:=1 to n do for j:=1 to r do if i=j then si,j:=1 else if j=1 then si,j:=1 else si,j:=j

12、*si-1,j+si-1,j-1;/求第二类Stirling数 for i:=1 to r do sn,r:=sn,r*i; writeln(sn,r);close(input);close(output);end.9.4 取数游戏源程序名 cycle.?(pas, c, cpp)可执行文件名 cycle.exe输入文件名 cycle.in输出文件名 cycle.out【问题描述】 有一个取数的游戏。初始时,给出一个环,环上的每条边上都有一个非负整数。这些整数中至少有一个0。然后,将一枚硬币放在环上的一个节点上。两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下:

13、(1)选择硬币左边或者右边的一条边,并且边上的数非0; (2)将这条边上的数减至任意一个非负整数(至少要有所减小); (3)将硬币移至边的另一端。 如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了。如下图,描述的是Alice和Bob两人的对弈过程,其中黑色节点表示硬币所在节点。结果图(d)中,轮到Bob走时,硬币两边的边上都是0,所以Alcie获胜。 2 0 0 0- - - -| | | | | | | |0| |5 0| |5 0| |1 0| |0| | | | | | | |- - - - 3 3 3 3 (a)Alice (b)Bob (c)Alice (d

14、)Bob现在,你的任务就是根据给出的环、边上的数值以及起点(硬币所在位置),判断先走方是否有必胜的策略。【输入】 第一行一个整数N(N20),表示环上的节点数。 第二行N个数,数值不超过30,依次表示N条边上的数值。硬币的起始位置在第一条边与最后一条边之间的节点上。【输出】 仅一行。若存在必胜策略,则输出“YES”,否则输出“NO”。【样例】 cycle.in cycle.out 4 YES 2 5 3 0 cycle.in cycle.out 3 NO 0 0 0【问题分析】 考虑一个简化的问题。如果硬币的一边的数值为0,那么惟一可能取胜的走法就是向另一边移动,并且把边上的数减到0。因为如果

15、不把边上的数减到0,那么下一步对方会将硬币移动到原来的位置,并且将边上的数减到0,这样硬币两边的数值就都为0了。所以,对于一边有0的情况,双方惟一的走法就是不停的向另一边移动,并取完边上的数值。因此,判断是否有必胜策略,就是看另一个方向上连续的非零边是否为奇数条。 那么两边都非零的情况呢?如果有一个方向上连续的非零边为奇数条,那么显然是有必胜策略的,因为只需往这个方向走并取完边上的数即可。如果两个方向上连续的非零边都是偶数条,则没有必胜策略。因为不管往哪个方向走,必然不能取完边上的数,否则必败。如果不取完,则下一步对方可以将硬币移动回原来的位置并取完边上的数,这样就变成了一边为0、另一边有偶数

16、条连续的非零边的情况,还是必败。所以,对于一般的情况,只需判断硬币的两边是否至少有一边存在奇数条连续的非零边。如果存在,则有必胜策略;否则无必胜策略。算法的时间复杂度为O(N)。【参考程序】program cgfdj;var i,n,left,right:longint;/left表示左边有几个连续非零数,right表示右边有几个连续非零数 a:array1.20of longint;beginassign(input,cycle.in);reset(input);assign(input,cycle.out);rewrite(output); readln(n); for i:=1 to n

17、 do read(ai); left:=0; right:=0; for i:=1 to n do if ai0 then inc(right)/统计右边 else break; for i:=n downto 1 do if ai0 then inc(left)/统计左边 else break; if odd(left) or odd(right) then writeln(YES)/有必胜策略 else if (not odd(left)and(not odd(right) then writeln(NO);/无必胜策略close(input);close(output);end.9.5

18、磁盘碎片整理源程序名 defrag.?(pas, c, cpp)可执行文件名 defrag.exe输入文件名 defrag.in输出文件名 defrag.out【问题描述】 出于最高安全性考虑,司令部采用了特殊的安全操作系统,该系统采用一个特殊的文件系统。在这个文件系统中所有磁盘空间都被分成了相同尺寸的N块,用整数1到N标识。每个文件占用磁盘上任意区域的一块或多块存储区,未被文件占用的存储块被认为是可是用的。如果文件存储在磁盘上自然连续的存储块中,则能被以最快的速度读出。 因为磁盘是匀速转动的,所以存取上面不同的存储块需要的时间也不同。读取磁盘开头处的存储块比读取磁盘尾处的存储块快。根据以上现

19、象,我们事先将文件按其存取频率的大小用整数1到K标识。按文件在磁盘上的最佳存储方法,1号文件将占用1, 2, , S1的存储块,2号文件将占用S1+1, S1+2, , S1+S2的存储块,以此类推(Si是被第i个文件占用的存储块的个数)。为了将文件以最佳形式存储在磁盘上,需要执行存储块移动操作。一个存储块移动操作包括从磁盘上读取一个被占用的存储块至内存并将它写入其他空的存储块,然后宣称前一个存储块被释放,后一个存储块被占用。 本程序的目的是通过执行最少次数的存储块移动操作,将文件安最佳方式存储到磁盘上,注意同一个文件的存储块在移动之后其相对次序不可改变。【输入】 每个磁盘说明的第一行包含两个

20、用空格隔开的整数N和K(1KN100000),接下来的K行每行说明一个文件,对第i个文件的说明是这样的:首先以整数Si开头,表示第i个文件的存储块数量,1=Si0 then writeln(We need ,s, move operations.) else writeln(No optimization needed.);close(input);close(output);end.9.6 欧几里德的游戏源程序名 game.?(pas, c, cpp)可执行文件名 game.exe输入文件名 game.in输出文件名 game.out【问题描述】 欧几里德的两个后代Stan和Ollie正在玩

21、一种数字游戏,这个游戏是他们的祖先欧几里德发明的。给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0。然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作直到一个人得到了0,他就取得了胜利。下面是他们用(25,7)两个数游戏的过程: Start:25 7 Stan:11 7 Ollie:4 7 Stan:4 3 Ollie:1 3 Stan:1 0 Stan赢得了游戏的胜利。 现在,假设他们完美地操作,谁会取得胜利呢?【输入】 第一行为测试数据的组数C。下面有C行,每行为一组数据,包含两个正整数M, N。(M, N不

22、超过长整型。)【输出】 对每组输入数据输出一行,如果Stan胜利,则输出“Stan wins”;否则输出“Ollie wins”【样例】 game.in game.out 2 Stan wins 25 7 Ollie wins 24 15【问题分析】 这是一道博弈题。解题的关键在于把握胜负状态的关系。 任意的状态只有两种可能:一种可能是胜状态即有必胜策略,另一种可能是负状态即没有必胜策略。对于任意的胜状态,无论如何走,都不可能走到另一个胜状态;而任意的负状态,至少存在一种走法可以走到胜状态。(0, 0)是初始的胜状态。 考察任意的状态(a, b),不妨假设ab。如果a/b2,则只有一种走法,即

23、将(a, b)变为(a-b, b)。那么,(a, b)是何种状态就取决于(a-b, b)是何种状态:根据前面胜负状态的定义可知,(a-b, b)为胜状态时,(a, b)为负状态;(a-b, b)为负状态时,(a, b)为胜状态。 如果a/b2,则至少存在两种走法:将(a, b)变为(c, b)或(c+b, b),这里ca mod b。如果这两个状态中至少有一个是负状态,则根据定义(a, b)是胜状态。如果两个状态都是胜状态,由于(c+b, b)可以变为(c, b),这就与“胜状态只能走到负状态”产生了矛盾,所以两个状态都是胜状态的情况是不存在的。因此,a/b2时,(a, b)必为胜状态。总结一下前面的

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1