矩阵模板

2019-04-14 19:33发布

class="markdown_views prism-atom-one-light"> #include #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(" "); } }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(); }