HDU1575(矩阵快速幂模板题)

来源:互联网 发布:商品排序权重算法 编辑:程序博客网 时间:2024/06/05 09:55

简单的矩阵快速幂,输入矩阵直接套模板做就行了。
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=9973ll;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(){;    int _case;    scanf("%d",&_case);    while(_case--)    {        int n;        ll k;        matrix sum;        scanf("%d",&n);        cin>>k;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                ll a;                cin>>a;                sum.mat[i][j]=a;            }        }        matrix res=quickmi(sum,k,n);        ll sumres=0;        for(int i=0;i<n;i++)        {            sumres=(sumres+res.mat[i][i])%mod;        }        cout<<sumres%mod<<endl;    }    return 0;}