poj 3070 Fibonacci 矩阵基础题

来源:互联网 发布:spark windows 安装包 编辑:程序博客网 时间:2024/05/02 23:54
#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>#include <iostream>using namespace std;const int mod=10000;struct matrix{    int f[2][2];};matrix mul(matrix a,matrix b){    matrix c;    memset(c.f,0,sizeof(c.f));    int i,j,k;    for(k=0;k<2;k++)    {        for(i=0;i<2;i++)        {            if(!a.f[i][k])continue;            for(j=0;j<2;j++)            {                if(!b.f[k][j])continue;                c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod;            }        }    }    return c;}matrix pow_mod(matrix a,int b){    matrix s;    memset(s.f,0,sizeof(s.f));    for(int i=0;i<2;i++)        s.f[i][i]=1;    while(b)    {        if(b&1)            s=mul(s,a);        a=mul(a,a);        b=b>>1;    }    return s;}int main(){    int n;    while(cin>>n)    {        if(n==-1)break;        matrix e;        e.f[0][0]=e.f[0][1]=e.f[1][0]=1;e.f[1][1]=0;        e=pow_mod(e,n);        cout<<e.f[0][1]<<endl;    }    return 0;}/*    矩阵基础题;    |f[n] f[n-1]|*|1 1|=|f[n+1] f[n]|                  |1 0|*/