#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MOD = 1000000;//根据需要取的末尾位数更改
const int MAX=10;//根据矩阵的大小上限更改
int t;
struct matrix
{
int m[MAX][MAX];
}ans, base;
matrix multi(matrix a, matrix b)
{
matrix tmp;
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
{
tmp.m[i][j]=0;
for(int k=0;k<t;k++)
tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
}
return tmp;
}
int fast_mod(int n)
{
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
if(i==j) ans.m[i][j]=1;//单位矩阵
else ans.m[i][j]=0;
while(n)
{
if(n&1) ans=multi(ans,base);
base=multi(base,base);
n>>=1;
}
return ans.m[0][t-1];
}
int main()
{
int n,tem;
scanf("%d",&tem);//矩阵大小
t=tem;
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
scanf("%d",&base.m[i][j]);//输入矩阵
scanf("%d",&n);//输入幂
printf("%d\n",fast_mod(n));
return 0;
}
原理:参考普通快速幂
- 偶数:k=fast_mod(k,n>>1,MOD);
- return k*k%MOD;
- 奇数:return k*fast_mod(k,n-1,MOD)%MOD;