Number Sequence (HDOJ 1005)

题目分析:由于n的范围在1~100,000,000,所以利用常规的每次保存上次运算结果的方法绝对会超时。题中mod7,即为解题的突破口,

          由于mod 7 所以f(n)的值只可能有7种结果(0~6),另由f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.,其中

                        A * f(n - 1) + B * f(n - 2)的结果所构成的序列的周期最多不过49,因为由排列组合的原理,

                        f(n-1) 7中结果,f(n-2) 7种结果,可得共49种变化。

                        到此解题就顺理成章了,把每个结果保存在数组中,直到发现数组的值又变回f(n)=1,f(n-1)=1;时,即为数组序列的周期。得到周期i后,最后的f(n)即等于f[n%i]

实现代码:

 

Code

 

讨论:在本题AC之后,忽在网上发现了这种解法其实是错误的,因为这个循环的结果序列不一定从第一个开始,所以随着测试数据的增强,定会碰到错误情况,但可能由于HDOJ的测试数据不够强,让我侥幸过关~~~。解决方案是,为所得到的结果序列增加一个标示,当重复出现两次得到同样的序列后,即可确定所得的序列周期即为正确的。

 

posted @ 2009-04-19 11:15  SoYoung  阅读(1295)  评论(2编辑  收藏  举报