hdu acm1005解题思路

本文深入分析了ACM题目1005的解题策略,通过抽屉原理揭示了数据周期性,解决了时间限制超时问题。详细解释了条件①、②、③,利用组合数与模运算特性,找到解决ACM问题的数学思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意,这里只提供思路。下面将进行数学分析,数学学渣退散。(基本公式)


-----------------------------------------------------------------基本情况---------------------------------------------------------------------------


2015年11月24日,今天我恰好对ACM的1005号题感兴趣,题目描述链接如下:

http://acm.hdu.edu.cn/showproblem.php?pid=1005

我第一眼看过去,恩,很简单,而且1005比较靠前嘛。所以,随手将代码写好了。输入样例,输出的内容也都正确了,范围限界也没问题,数据格式没问题。然后信心满满地Submit了。

结果:Time Limit Exceeded


----------------------------------------------------------我的初步分析---------------------------------------------------------------------


看了看内存占用,也没问题。时间不够,这说明了问题可能出在了数据的规模上。我看了一下以前我做的(我以前曾经做出来,不过那时是抄的,没仔细想,Rank278),发现基本跟我现在做的差不多。


------------------------------------------------------------查找相关网络资源--------------------------------------------------------------------------------


下面是网上的样例代码:

http://blog.youkuaiyun.com/jinyongqing/article/details/21537175

我的也差不多,不过我的初始代码没有:System.out.println(f[n % 49]);  


我的是直接从3开始计算到n,所以Time Limit Exceeded

于是我再次去百度、必应了相关的问题,不过搜出来一大堆都是相互之间copy的。

我回到宿舍后,下意识先打开了知乎,随手一搜,还真被我搜到了。

http://www.zhihu.com/question/31593349 张雄骐的回答


他提及到了一个词“抽屉原理”,我百度了一下,大致内容如下:

http://baike.baidu.com/link?url=4ORhFFWCYhXtbMBjxhsLpylVTW83ISeP2gTQxFyTp61Bba0vLYl6If-0yMTxMEeiipUt9ODTvD29n-YF8TXaT_


我看了一遍抽屉原理后,回过头来,哦了一声,然后发现了acm1005的解题原理。



---------------------------------------------正式分析--------------------------------------------



大笑看了我那么多废话,终于要进入正题咯!!!


回想一下acm1005的条件,f(1)=1=f(2),f(n)=(A*f(n-1)+B*f(n-2))mod7

这里A、B都是固定的,对吧。而f(n)无论如何都只会是0、1、2、3、4、5、6,也就是7种可能性。


条件①:假设n1=10时,f(n1-1)=f(9)=6,f(n1-2)=f(8)=3;

n2=36时,f(n2-1)=f(35)=6,f(n2-2)=f(34)=3;


这时是有一个等式的:

f(n1)=(A*f(n1-1)+B*f(n1-2))mod7

=(A*f(9)+B*f(8))mod7

=(A*6+B*3)mod7

=(A*f(n2-1)+B*f(n2-2))mod7

=f(n2)


是不是很神奇?


条件②:f(n-1)与f(n-2)都是由mod7得来的,即便是f(1)、f(2)也好,都算在里面。

所以f(n-1)与f(n-2)的可能性都为0、1、2、3、4、5、6,也就是说,组合[f(n-1),f(n-2)]一共只有7*7=49种可能性,所以这就出现了周期性。


条件③:什么是周期性呢?就拿上面的n1与n2为例:

n1对应的公式是(A*f(n1-1)+B*f(n1-2))mod7,

n2对应的公式是(A*f(n2-1)+B*f(n2-2))mod7,


由于上下的A、B都是一样的,所以可以视为:

n1对应的组合是[f(n1-1),f(n1-2)],

n2对应的组合是[f(n2-1),f(n2-2)],

根据上述的条件①可知,f(n1-1)=f(n2-1)并且f(n1-2)=f(n2-2),所以:

n1对应的组合又为[6,3],

n2对应的组合又为[6,3],

那么想一下,如果将上面的数据放到acm1005的条件中去计算,是不是f(n1)=f(n2),f(n1+1)=f(n2+1),……,f(n1+K)=f(n2+K)???


类比于我们在初一时学的三角函数一样,设周期为T,则k*T=n2-n1,所以这个周期的大小我就不在这详细说明了。我在上面也粘了一段别人做好的代码。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值