【模板】矩阵快速幂
2017-11-10 16:58
344 查看
题目背景
矩阵快速幂题目描述
给定n*n的矩阵A,求A^k输入输出格式
输入格式:第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素
输出格式:
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7
输入输出样例
输入样例#1:2 1 1 1 1 1
输出样例#1:
1 1 1 1
说明
n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂#include <cstdio> #include <cmath> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int mod = 1e9 + 7; ll n, k; ll ans[110][110], a[110][110], b[110][110]; void mul2() { memset(b, 0, sizeof(b)); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) b[i][j] = (b[i][j] + ans[i][k] * a[k][j] % mod) % mod; memcpy(ans, b, sizeof(b)); } void mul1() { memset(b, 0, sizeof(b)); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) b[i][j] = (b[i][j] + a[i][k] * a[k][j] % mod) % mod; memcpy(a, b, sizeof(b)); } void qpow(ll b) { for (int i = 1; i <= n; i++) ans[i][i] = 1; while (b) { if (b & 1) mul2(); mul1(); b >>= 1; } } int main() { scanf("%lld%lld", &n, &k); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) scanf("%lld", &a[i][j]); qpow(k); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) printf("%lld ", ans[i][j]); printf("\n"); } return 0; }
相关文章推荐
- HDU 1757 A Simple Math Problem(矩阵快速幂模板)
- [模板] - 矩阵快速幂
- 矩阵乘法+快速幂——【模板】矩阵快速幂
- 斐波那契数列的第N项(矩阵快速幂模板)
- 郭姐散步(二)(矩阵快速幂模板题)
- luogu P3390 【模板】矩阵快速幂
- hdu 4965 Fast Matrix Calculation【矩阵快速幂模板】
- 【模板】矩阵快速幂
- 矩阵快速幂模板
- Tr A (矩阵快速幂(模板))
- hdu5171 GTY's birthday gift 矩阵快速幂求斐波那契前n项和,矩阵快速幂模板
- 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板
- 矩阵快速幂模板
- Luogu-3390 (矩阵快速幂模板)
- POJ_Fibonacci POJ_3070(矩阵快速幂入门题,附上自己写的矩阵模板)
- 【模板】【代数】矩阵乘法和矩阵快速幂
- POJ3070 矩阵快速幂模板题
- 模板——矩阵快速幂
- 矩阵快速幂 模板
- 洛谷 P3390 【模板】矩阵快速幂