poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

来源:互联网 发布:python双击闪退 编辑:程序博客网 时间:2024/06/04 19:48

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数。如果后四位全为0,则输出0,否则

输出后四位去掉前导0,也。。。就。。。是。。。说。。。输出Fn%10000。


题目说的如此清楚。。我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后

去掉前导0。o(╯□╰)o

还有矩阵快速幂的幂是0时要特判。


P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶!大笑


#include<cstdio>#include<iostream>#include<cstring>#define maxn 5using namespace std;const int mod = 10000;int n,q;struct Mat{    int mp[maxn][maxn];    bool operator = (Mat a)    {        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)                mp[i][j] = a.mp[i][j];        }    }};Mat operator *(Mat a,Mat b){    Mat c;    memset(c.mp,0,sizeof(c.mp));    for(int k=0;k<n;k++)    {        for(int i=0;i<n;i++)        {            if(a.mp[i][k]<=0) continue;            for(int j=0;j<n;j++)            {                if(b.mp[k][j]<=0) continue;                c.mp[i][j] = c.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%mod;                if(c.mp[i][j]>mod) c.mp[i][j]-=mod;            }        }    }    return c;}Mat operator ^(Mat a,int k){    Mat c;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)            c.mp[i][j] = (i==j);    }    while(k)    {        if(k&1)            c = c*a;        a =a*a;        k>>=1;    }    return c;}int main(){    while(scanf("%d",&q)!=EOF)    {        if(q == -1) break;        Mat x;        x.mp[0][0] = 0;        x.mp[0][1] = 1;        x.mp[1][0] = 1;        x.mp[1][1] = 1;        Mat y;        y.mp[0][0] = 0;        y.mp[1][0] = 1;        Mat z;        n = 2;        if(!q)        {            printf("0\n");            continue;        }        z = x^(q-1);        Mat tmp = z*y;        printf("%d\n",tmp.mp[1][0]%10000);    }    return 0;}


0 0
原创粉丝点击