矩阵模板 51nod 算法马拉松分解问题

来源:互联网 发布:交换机端口速率与带宽 编辑:程序博客网 时间:2024/06/10 02:38

题目:点击打开链接

一个矩阵乘法问题,(1+sqrt(2))的n次方!

#include<bits/stdc++.h>    using namespace std;#define maxn (1000000007)struct Mat{    long long mat[2][2];};Mat init(Mat x){    x.mat[0][0]=1;    x.mat[0][1]=2;    x.mat[1][0]=1;    x.mat[1][1]=1;    return x;}Mat operator+(Mat a,Mat b){    Mat c;    int i,j;    for (i=0;i<2;i++)    {        for (j=0;j<2;j++)            c.mat[i][j] = a.mat[i][j]+b.mat[i][j];    }    return c;}Mat operator*(Mat a,Mat b){    int i,j,k;    Mat c;    for (i=0;i<2;i++)    {        for (j=0;j<2;j++)        {       c.mat[i][j] = 0;       for (k=0;k<2;k++)       {                c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%maxn;                c.mat[i][j]=(c.mat[i][j]+maxn)%maxn;       }       //c.mat[i][j]%=MOD;        }    }    return c;}Mat operator^(Mat a,long long x){    Mat p=a;    Mat q;    q=init(q);     while (x>=1)     {         if(x%2==1)             p = p*q;         x/=2;         q = q*q;     }     return p;}int main(){    long long n;    cin>>n;    Mat ans;    ans.mat[0][0]=1;    ans.mat[0][1]=0;    ans.mat[1][0]=0;    ans.mat[1][1]=1;    if(n==0){        printf("1\n");    }    else if(n%2==1){        ans=ans^n;        printf("%I64d\n",(ans.mat[1][0]*ans.mat[0][1])%maxn);    }    else{        ans=ans^n;        printf("%I64d\n",(ans.mat[0][0]*ans.mat[1][1])%maxn);    }    return 0;}


0 0
原创粉丝点击