1. 程式人生 > >郵箱:[email protected]

郵箱:[email protected]


#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(); }