HDU_1021 Fibonacci Again 一些推论

Fibonacci Again

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31558    Accepted Submission(s): 15298

Problem Description
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
 
Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
 
Output
Print the word "yes" if 3 divide evenly into F(n).
Print the word "no" if not.
 
Sample Input
0 1 2 3 4 5
 
Sample Output
no no yes no no no
 
原本想说打表fibonacci[n],然后输入n,判断fibonacci[n]%3==0则输出yes否则no,竟然被WA,想不出原因,不过想想hdu也不会出这么简单的题,于是就研究了下
首先,fibonacci[n]=fibonacci[n-1]+fibonacci[n-2],如果将fibonacci[n]用fibonacci[0]与fibonacci[1]表示的话,那就会得到下面的表达式
 
fibonacci[n]=f[n-2]*fibonacci[0]+f[n-1]*fibonacci[1]
 
其中f[n]为f[0]=1,f[1]=1的斐波那契数列,换句话说,不管起始数fibonacci[1,0]如何,它总能换成如上形式;
 
因此我们可以来研究看看这个最基本的斐波那契数组f[n]={ 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55.... }
设其中一个数为f[i],f[i] mod a = loop[i]
我没查过资料,就是有个猜想:loop[i]是一个循环数组
我编了个程序运算了下,f[i] mod 4 得到以 1,1,2,3,1,0,1 循环的数组,f[i] mod 3 得到以 1,1,2,0,2,2,1,0 循环的数组
f[i] mod 5 得到的比较长,但也是一个循环,这下算是有点底气了
 
既然是循环,就一定有共性
 
回到原题,既然f[i] mod 3 的循环只有8个元素,那就一个个试过去
 
其实正常的思路应该是这样,要让fibonacci[n] mod 3==0,就是要让[ f[n-2]*7 + f[n-1]*11 ] mod 3 == 0
即 ( f[n-2]+2f[n-1] ) mod 3 == 0;
即 ( loop[n-2]+2loop[n-1] ) mod 3 == 0;
 
这下就可以利用循环了
 
试过之后发现n==2 , 和 n==6 是可以的,之后又是循环,所以只要 n%8 == 2 或 n%8 == 6 就可以了
然后上面又等价于 n%4 == 2
就一步搞定啦
 
其实原本打表之后一个一个试,试过了发现2,6,10,14,18后面都是yes,所以~~~~你懂得,然后就AC了
 
做个总结:
一:
fibonacci[n]=f[n-2]*fibonacci[0]+f[n-1]*fibonacci[1] 
其中f[n]为f[0]=1,f[1]=1的斐波那契数列,不管起始数fibonacci[1,0]如何,它总能换成如上形式;
二:
f[i] mod a = loop[i]
loop[i]是一个循环数组
三:
做到这种题首先一个一个试过去!!!!
 
贴上代码:
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int N;
 6     while(cin>>N)
 7     {
 8         if ( (N+2)%4==0 )
 9             cout<<"yes
";
10         else 
11             cout<<"no
";
12     }
13 }
原文地址:https://www.cnblogs.com/neverchanje/p/3475215.html