poj 3070 Fibonacci(矩阵快速幂)

2014-11-24 13:11:12 · 作者: · 浏览: 4

Description

In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn 1 + Fn 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

\.< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+R2l2ZW4gYW4gaW50ZWdlciA8ZW0+bjwvZW0+LCB5b3VyIGdvYWwgaXMgdG8gY29tcHV0ZSB0aGUgbGFzdCA0IGRpZ2l0cyBvZiA8ZW0+RjxzdWI+bjwvc3ViPjwvZW0+LjwvcD4KCjxwIGNsYXNzPQ=="pst">Input

The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number 1.

Output

For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

Sample Input

0
9
999999999
1000000000
-1

Sample Output

0
34
626
6875
 
 
代码:
#include 
   
    
#include 
    
      #include 
     
       using namespace std; struct mat { long long t[2][2]; void set() { memset(t,0,sizeof(t)); } }a,b; mat multiple(mat a,mat b,int n,int p) { int i,j,k; mat temp; temp.set(); for(i=0;i
      
       >=1; b=multiple(b,b,2,p); } return a; } void init() { a.t[0][0]=2; a.t[0][1]=1; a.t[1][0]=1; a.t[1][1]=0; b.t[0][0]=1; b.t[0][1]=1; b.t[1][0]=1; b.t[1][1]=0; } int main() { int n; while(cin>>n) { if(n<0) break; init(); a=quick_mod(a,b,n,10000); cout<