HDU3306(矩阵快速幂)

来源:互联网 发布:奥迪工程师软件 编辑:程序博客网 时间:2024/05/17 18:26

正在死磕矩阵类的题,这个题不是很难,想到构造关于A2n的矩阵就没问题了。
公式给我们了,直接构造矩阵就好了

A2nA2n1AnAn1Sn1=x21x1y20002xy0y00000A2n1A2n2An1An2Sn2

code:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>#include<time.h>//a&3==a%4using namespace std ;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps = 1e-8;const int maxn = 110010;const int inf = 0x3f3f3f3f;const ll mod=10007ll;struct matrix{    ll mat[10][10];//mat[i][j]=第i行第j列    matrix()    {        for(int i=0;i<10;i++)        {            for(int j=0;j<10;j++)            {                mat[i][j]=0ll;            }        }    }};void out(matrix a,int n){    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            cout<<a.mat[i][j]<<"   ";        }        cout<<endl;    }}matrix multiply(matrix a,matrix b,int n){    matrix res;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            for(int k=0;k<n;k++)            {                res.mat[i][j]+=a.mat[i][k]*b.mat[k][j]%mod;                res.mat[i][j]%=mod;            }        }    }    return res;}matrix quickmi(matrix a,ll b,int n){    matrix E;    matrix res;    for(int i=0;i<n;i++)    {        E.mat[i][i]=1;        res.mat[i][i]=1;    }    E=multiply(a,E,n);    while(b>0)    {        if(b%2==1)        {            res=multiply(res,E,n);        }        b=b/2;        E=multiply(E,E,n);    }    return res;}int main(){;    ll a,b,c;    while(cin>>a>>b>>c)    {        matrix sum;        sum.mat[0][0]=b*b;sum.mat[0][1]=c*c;sum.mat[0][2]=2*b*c;        sum.mat[1][0]=1ll;        sum.mat[2][0]=b;sum.mat[2][2]=c;        sum.mat[3][0]=1ll;sum.mat[3][3]=1ll;        if(a==0)        {            cout<<1<<endl;        }        else if(a==1)        {            cout<<2<<endl;        }        else        {            matrix res=quickmi(sum,a,4);            ll Res=0;            for(int i=0;i<4;i++)            {                Res=(Res+res.mat[3][i])%mod;            }            Res=Res%mod;            cout<<Res<<endl;        }    }    return 0;}
原创粉丝点击