POJ 3070 Fibonacci 矩阵快速幂

来源:互联网 发布:新浪汽车销量数据库 编辑:程序博客网 时间:2024/06/04 05:21

Fibonacci
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu
Submit

Status
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
Hint
As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

.

Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

.

#include<stdio.h>#include<string>#include<cstring>#include<queue>#include<algorithm>#include<functional>#include<vector>#include<iomanip>#include<math.h>#include<iostream>#include<sstream>#include<stack>#include<set>#include<bitset>using namespace std;const int INF=0x3f3f3f3f;const int MOD=10000;const int SIZE=4;typedef long long ll;struct Matrix{    int n;    ll Mat[SIZE][SIZE];    Matrix(int a):n(a)    {        for (int i=0;i<n;i++)            for (int j=0;j<n;j++)                Mat[i][j]=0;    }    Matrix operator * (Matrix& x)    {        Matrix result(n);        for (int k=0;k<n;k++)            for (int i=0;i<n;i++)                for (int j=0;j<n;j++)                    result.Mat[i][j]=(result.Mat[i][j]+Mat[i][k]%MOD*x.Mat[k][j]%MOD)%MOD;        return result;    }    Matrix operator ^ (ll x)    {        Matrix temp(n),a(*this);        for (int i=0;i<n;i++)            temp.Mat[i][i]=1;        while (x)        {            if (x&1)                temp=a*temp;            a=a*a;            x>>=1;        }        return temp;    }};int main(){    cin.sync_with_stdio(false);    int n;    Matrix F(2);    F.Mat[0][0]=1,F.Mat[0][1]=1,F.Mat[1][0]=1,F.Mat[1][1]=0;    while (cin>>n&&n!=-1)    {        Matrix Ans=F^n;        cout<<Ans.Mat[0][1]<<endl;    }    return 0;}
0 0
原创粉丝点击