woj 1540 Fibonacci 矩阵快速幂

来源:互联网 发布:实况泽罗伯托巅峰数据 编辑:程序博客网 时间:2024/05/22 11:31

题目地址:戳这里

求Fibonacci数列前n项的立方和。

 比赛的时候.. 构造一个10*10的矩阵  跪了,很多无用信息:

代码:

#include<iostream>using namespace std;const int mod=1000000007;struct Matrix{    long long p[10][10];    };Matrix   multi(Matrix A,Matrix B){    Matrix ans;    long long sum=0;    for(int i=0;i<10;i++)        for(int j=0;j<10;j++)        {            sum=0;            for(int k=0;k<10;k++)                sum=(sum+(A.p[i][k]*B.p[k][j])%mod)%mod;            ans.p[i][j]=sum;        }        return ans;}Matrix  quick_mod(Matrix A,int n){    Matrix ans;        for(int i=0;i<10;i++)        for(int j=0;j<10;j++)            ans.p[i][j]=(i==j?1:0);        while(n>0)    {        if(n&1)        {            ans=multi(ans, A);                    }                n>>=1;        A=multi(A, A);    }            return ans;        }int main(){        int n;        while (cin>>n) {                if(!n)  break;                        if(n==1) cout<<1<<endl;        else if(n==2)  cout<<2<<endl;        else                    {                       Matrix ans;                                    for(int i=0;i<10;i++)                for(int j=0;j<10;j++)                    ans.p[i][j]=0;                        ans.p[0][1]=1;                        ans.p[1][0]=1;            ans.p[1][1]=1;                                    ans.p[2][3]=1;                        ans.p[3][3]=1;            ans.p[3][4]=2;                                    ans.p[4][3]=1;            ans.p[4][4]=1;                                    ans.p[5][5]=2;            ans.p[5][6]=1;            ans.p[5][8]=1;                        ans.p[6][5]=1;            ans.p[6][8]=1;                        ans.p[7][8]=1;                        ans.p[8][5]=3;            ans.p[8][6]=3;            ans.p[8][7]=1;            ans.p[8][8]=1;                        ans.p[9][8]=1;            ans.p[9][9]=1;                                                                        ans=quick_mod(ans, n-1);                                    //            for(int i=0;i<3;i++)            //            {            //                for(int j=0;j<3;j++)            //                {            //                   cout<<ans.p[i][j]<<' ';            //                }            //                cout<<endl;            //            //            }            long long result=0;                        for(int i=0;i<10;i++)                result=(result+ans.p[9][i])%mod;                        cout<<result<<endl;                                                        }                    }}

2  实际上5*5 就可以了

#include<iostream>using namespace std;const int mod=1000000007;struct Matrix{    long long p[5][5];    };Matrix a;Matrix   multi(Matrix A,Matrix B){    Matrix ans;    long long sum=0;    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)        {            sum=0;            for(int k=0;k<5;k++)                sum=(sum+(A.p[i][k]*B.p[k][j])%mod)%mod;            ans.p[i][j]=sum;        }        return ans;}Matrix  quick_mod(Matrix A,int n){    Matrix ans;        for(int i=0;i<5;i++)        for(int j=0;j<5;j++)            ans.p[i][j]=(i==j?1:0);        while(n>0)    {        if(n&1)        {            ans=multi(ans, A);                    }                n>>=1;        A=multi(A, A);    }            return ans;        }int main(){        int n;        while (cin>>n) {                if(!n)  break;        if(n==1) cout<<1<<endl;        else if(n==2)  cout<<2<<endl;        else                    {            Matrix ans;            for(int i=0;i<5;i++)                for(int j=0;j<5;j++)                    ans.p[i][j]=0;            ans.p[0][1]=1;                        ans.p[1][0]=1;            ans.p[1][1]=1;            ans.p[1][2]=3;            ans.p[1][3]=3;                        ans.p[2][1]=1;            ans.p[2][3]=1;                        ans.p[3][1]=1;            ans.p[3][2]=1;            ans.p[3][3]=2;                        ans.p[4][1]=1;            ans.p[4][4]=1;                                    ans=quick_mod(ans, n-1);                                long long result=0;                        for(int i=0;i<5;i++)            result=(result+ans.p[4][i])%mod;            cout<<result<<endl;                                                        }                    }}


0 0
原创粉丝点击