首页 > 代码库 > poj 3070 Fibonacci(矩阵快速幂)
poj 3070 Fibonacci(矩阵快速幂)
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
.
Given an integer n, your goal is to compute the last 4 digits of Fn.
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 <iostream> #include <cstdio> #include <cstring> 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<n;i++) for(j=0;j<n;j++) { if(a.t[i][j]) for(k=0;k<n;k++) temp.t[i][k]=(temp.t[i][k]+a.t[i][j]*b.t[j][k])%p; } return temp; } mat quick_mod(mat a,mat b,int n,int p) { while(n) { if(n&1) { a=multiple(a,b,2,p); } n>>=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<<a.t[1][1]<<endl; } return 0; }