您的位置:首页 > 其它

HDU1575(矩阵快速幂模板题)

2017-10-11 20:57 357 查看
简单的矩阵快速幂,输入矩阵直接套模板做就行了。

code

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string>
#include <set>
#include<time.h>
//a&3==a%4
using 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;
}
}
}
r
be80
eturn 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: