注意,这里只提供思路。下面将进行数学分析,数学学渣退散。(基本公式)
-----------------------------------------------------------------基本情况---------------------------------------------------------------------------
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 张雄骐的回答
他提及到了一个词“抽屉原理”,我百度了一下,大致内容如下:
我看了一遍抽屉原理后,回过头来,哦了一声,然后发现了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,所以这个周期的大小我就不在这详细说明了。我在上面也粘了一段别人做好的代码。