矩阵快速幂 初级板子 待更新
基础 矩阵乘法
关于 快速幂已经了解了
所以现在就是 矩阵快速幂了 相同的套路 只不过是运用到矩阵上面了;
推荐blog :http://www.cnblogs.com/SYCstudio/p/7211050.html
然后自己手写了两遍 之前一直不敢接触 其实接触了才发现 大概也不是很难的东西。
加油 多学一些东西
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 120; const int mod = 1e9+7; int n;//n*n的矩阵 ll a[maxn][maxn]; class Matrix { public: ll s[maxn][maxn]; Matrix()//矩阵初始化 { for(int i=0;i<n;i++) for(int j=0;j<n;j++) s[i][j] = 0; } Matrix(ll a[maxn][maxn])//赋值初始化 { for(int i=0;i<n;i++) for(int j=0;j<n;j++) s[i][j] = a[i][j]; } void print() { for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { if(j!=0) printf(" "); printf("%lld",s[i][j]); } puts(""); } } }; Matrix operator *(Matrix a,Matrix b) // 重载符号* { Matrix ans; for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) ans.s[i][j] = (ans.s[i][j] + a.s[i][k]*b.s[k][j]%mod)%mod; return ans; } void _pow(ll k)//快速幂板子 { Matrix A(a),B(a); while (k >0) { if(k&1) A= A*B; B=B * B; //这里还是不能用B*=B; k>>=1; } A.print(); } int main () { ll k;//k次方 scanf("%d %lld",&n,&k); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%lld",&a[i][j]); k--; /*注意,这里为什么要-1呢,因为我们知道a^1是a, 对于矩阵来说就是A^1是A,所以在传进去的时候先-1(相当于已经进行了一次操作), 而若k==1,则在Pow(Po-1)中不会执行循环,此时也正好是矩阵A*/ _pow(k); }