HDOJ 1005 的一些分析的摘要

HDOJ 1005 的一些分析的摘要


做这题的时候 犯了一个大多数人都会犯的错误,结果TLE了。上网google下 发现其中几篇写的不错,汇总了下他们的思路,相信对你有帮助

建议先不要看别人代码,看了这些分析试着自己去实现下,实在不行再看别人代码才会豁然开朗。

他山之石,可以为玉,然也!


来自http://hi.baidu.com/shrimpy56/blog/item/b0c2ad3dd2cd72e155e723f2.html
1、必然会出现循环
这是基于下面事实:
1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+1) mod p +F(n) modp) mod p
2. 斐波那契数列的最大公约数定理:gcd(F(m),F(n))=F(gcd(m,n))
最大公约数定理表明如果F(k)能被N整除,则F(ik)也能被N整除,这就表明了斐波那契数列所含因子的周期性,下面列举:
因子:2,3,4,5, 6,7,8, 9,10,11,12
周期:3,4,6,5,12,8,6,12,15,10,12
我们称所生成的序列为剩余序列,那么一旦出现某个F(k) 能被N整除(这需证明我的一个猜想:对于任意素数P,F(P),F(P-1)和F(P+1)三个中定有一个能被P整除),以后F(ik)都能被N整除,亦即剩余序列周期地出现0,下一个剩余序列值为N-1种可能,总会重复,有两个相邻的重复该序列就一定重复,亦即具有周期性。
这个周期叫做皮萨诺周期
The sequence of Fibonacci numbers is periodic modulo any modulus  (Wall 1960). These periods are known as Pisano periods  (Wrench 1969). The Fibonacci numbers modulo  for small  are tabulated below, together with their Pisano periods.
 
 
Sloane  (mod  )

2 3 A011655
1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, ...
3 8 A082115
1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
4 6 A079343
1, 1, 2, 3, 1, 0, 1, 1, 2, 3, 1, 0, 1, 1, 2, ...
5 20 A082116
1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, ...
6 24 A082117
1, 1, 2, 3, 5, 2, 1, 3, 4, 1, 5, 0, 5, 5, 4, ...
7 16 A082116
1, 1, 2, 3, 5, 1, 6, 0, 6, 6, 5, 4, 2, 6, 1, ...
8 12 A079344
1, 1, 2, 3, 5, 0, 5, 5, 2, 7, 1, 0, 1, 1, 2, ...

来自http://www.cppblog.com/wing/archive/2011/10/20/124539.html
2、正确思路是:因为mod7的关系,而且f(1)=f(2)=1,所以f(n)的值是循环分布的,而且一定会回到f(n-1)=f(n)=1,
//并且还可得出,这个循环不大于49,因为相邻连个f只有7种取值,这样f(n-1)和f(n)共有49种组合。
//所以,只要找出循环因子即可,寻找方法正是根据f(n-1)=f(n)再次出现的地方来计算
//可以首先为这个题目写一个测试的程序设定一个 a   b   n(n 比较小时)  的值   看看输出规律

来自http://blog.sina.com.cn/s/blog_4c8a2a870100ndf0.html
3、只要找到k使f[k-1] = f[n-1],f[k-2]=f[n-2];特别地,当k等于2时就可以了,
因为f[1],f[2]必然是循环的起始。又因为f[n-1],f[n-2]都只能取0到6共七个数,
因此有49种组合方式,也就是说50内必然可以找到满足条件的k,就是循环周期小于50。

你可能感兴趣的:(c,Google,测试,n2,Numbers)