郵箱:[email protected]
阿新 • • 發佈:2019-01-04
#include<stdio.h>
#include<string.h>
#define D long long
#define N 109
#define MOD ((int)1e9+7)
struct matrix{
int size;
D mat[N][N];
matrix(int s){
size=s;memset(mat,0,sizeof(mat));
}void init(){
for(int i=1;i<=size;i++){
for(int j=1;j<=size ;j++){
scanf("%lld",&mat[i][j]);
}
}
}void out(){
for(int i=1;i<=size;i++){
for(int j=1;j<=size;j++){
printf("%lld ",mat[i][j]);
}printf("\n");
}
}matrix operator * (const matrix & x)const{
matrix ans(x.size);
for(int i=1;i<=x.size;i++){
for(int j=1;j<=x.size;j++){
for(int k=1;k<=x.size;k++){
ans.mat[i][j]=(ans.mat[i][j]+mat[i][k]*x.mat[k][j])%MOD;
}
}
}return ans;
}
} ;
/*
註釋:假設非方陣
1 2 * 3 相當於 1 2 * 3 0
4 0 0 4 0
*/
matrix swift(matrix a,long long t){
matrix ans(a.size);
for(int i=1;i<=a.size;i++)ans.mat[i][i]=1;
while(t){
if(t&1ll)ans=ans*a;
a=a*a;t>>=1;
}return ans;
}
int main(){
matrix a(2),b(2),c(2);
a.init();b.init();
c=a*b;
c.out();
a.init();
a=swift(a,3);
a.out();
}