矩陣快速冪

在斐波那契數列中,Fib0=0,Fib1=1,Fibn=Fibn1+Fibn2(n>1)Fib0=0,Fib1=1,Fibn=Fibn−1+Fibn−2(n>1)。ios

給定整數n,求Fibnmod10000Fibnmod10000。ide

輸入格式

輸入包含多組測試用例。測試

每一個測試用例佔一行,包含一個整數n。atom

當輸入用例n=-1時,表示輸入終止,且該用例無需處理。spa

輸出格式

每一個測試用例輸出一個整數表示結果。code

每一個結果佔一行。xml

數據範圍

0n21090≤n≤2∗109blog

輸入樣例:

0
9
999999999
1000000000
-1 

輸出樣例:

0
34
626
6875







 

 


代碼;
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;
const int mod  = 10000;
int mul(int f[2],int a[2][2])
{
    int c[2];
    memset(c,0,sizeof(c));
    for(int j=0;j<2;j++)
    {
        for(int k=0;k<2;k++)
        c[j] = (c[j]+(ll) f[k]*a[k][j])%mod;
    }
    memcpy(f,c,sizeof(c));
}
int mulself(int a[2][2])
{
    int c[2][2];
    memset(c,0,sizeof(c));
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<2;k++)
            {
                c[i][j] = (c[i][j] + (ll)a[i][k]*a[k][j])%mod;
            }
        }
    }
    memcpy(a,c,sizeof(c));
}
int main()
{
    int n;
    while(~scanf("%d",&n)&&n!=-1)
    {
        int f[2]={0,1};
        int a[2][2] ={{0,1},{1,1}};
        for(;n;n>>=1)
        {
            if(n&1)mul(f,a);
            mulself(a);
        }
        cout << f[0] << endl;
    }
    return 0;
}
View Code
相關文章
相關標籤/搜索