51nod 1126 求递推序列的第N项【矩阵快速幂】

来源:互联网 发布:淘宝优站排名 编辑:程序博客网 时间:2024/06/07 16:21
#include<iostream>#include<string.h>using namespace std;const int mod=7;typedef struct node{     long long a[2][2];    void init(){  //初始化单位矩阵         memset(a,0,sizeof(a));        for(int i=0;i<2;i++)            a[i][i]=1;    }}matrix;matrix mul(matrix a,matrix b){    matrix ans;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++){            ans.a[i][j]=0;            for(int k=0;k<2;k++)                ans.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;            ans.a[i][j]=(ans.a[i][j]+mod)%mod;        }    return ans;}matrix add(matrix a,matrix b){ //矩阵加法    matrix ans;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)            ans.a[i][j]=(a.a[i][j]+b.a[i][j])%mod;    return ans;}matrix pow(matrix a,int n){  //a的n次方     matrix ans;    ans.init(); //调用函数初始化    while(n){        if(1&n) ans=mul(ans,a);        n/=2;        a=mul(a,a);    }    return ans;}int main(){    int a,b,n;    matrix s,ans; //    cin>>a>>b>>n;    s.a[0][0]=0;s.a[0][1]=1;    s.a[1][0]=b;s.a[1][1]=a;    ans.a[0][0]=1;ans.a[0][1]=0;    ans.a[1][0]=1;ans.a[1][1]=0;    ans=mul(pow(s,n-1),ans);    cout<<ans.a[0][0]<<endl;    return 0;}
原创粉丝点击