POJ 3070 Fibonacci

来源:互联网 发布:软件串口是什么意思 编辑:程序博客网 时间:2024/05/18 01:40

题目

#include<cstdio>#include<cstring>using namespace std;struct Mat{    int a[10][10];}unit,mat;Mat cheng(Mat a,Mat b){    Mat c;    memset(c.a,0,sizeof c.a);    for(int i=1;i<=4;++i)        for(int j=1;j<=4;++j)            for(int k=1;k<=4;++k)            {                c.a[i][j]+=a.a[i][k]*b.a[k][j];                if(c.a[i][j]>=10000) c.a[i][j]%=10000;            }    return c;}Mat fast_pow(Mat a,int p){    Mat ans=unit;    for(;p;p>>=1,a=cheng(a,a))    {        if(p&1)            ans=cheng(ans,a);    }    return ans;}int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=2;++i) unit.a[i][i]=1;    while(n!=-1)    {        memset(mat.a,0,sizeof mat.a);        mat.a[1][1]=mat.a[1][2]=mat.a[2][1]=1;        mat=fast_pow(mat,n);        printf("%d\n",mat.a[1][2]);        scanf("%d",&n);    }    return 0;}