求和(矩阵快速幂)
Posted xcfxcf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求和(矩阵快速幂)相关的知识,希望对你有一定的参考价值。
等比数列是指从第二项起,每一项与它的前一项的比值等于同一个常数的一种数列。对于一个等比数列an=a1qn-1,它的前n项的和Sn=a1(1-qn)/(1-q)(q≠1)。现在已知A为n*n的矩阵,S=A+A2+A3+...+Am,你能否正确求出S,并且输出S中的每一个元素对1000000007取模后的值。
输入
输入包括n+1行,第一行包括两个正整数n, m,分别代表矩阵A的大小和S中的项数,其中1≤n≤30, 1≤m≤109。接下来n行,每行n个元素,相应地代表A中的元素x,其中0≤x≤106。
输出
输出包括n行,每行n个元素,相应地代表S中的每一个元素对1000000007取模后的值。
2019
#include <bits/stdc++.h> using namespace std; #define int long long const int mod = 1e9 + 7; const int maxn = 126; int n, m; int a[maxn][maxn], b[maxn][maxn]; int c[maxn][maxn]; int i, j, k; void mul(int x[maxn][maxn], int y[maxn][maxn]) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { c[i][j] = 0; for (k = 1; k <= n; k++) c[i][j] = (c[i][j] + x[i][k] * y[k][j]) % mod; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { x[i][j] = c[i][j]; } } } void ksm() { m++; while (m) { if (m & 1) mul(b, a); m >>= 1; mul(a, a); } } signed main() { //freopen("in","r",stdin); ios::sync_with_stdio(0); cin >> n >> m; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { cin >> a[i][j]; } a[i][i + n] = a[i + n][i + n] = b[i][i] = b[i + n][i + n] = 1; } n *= 2; // for (i = 1; i <= n; i++) { // for (j = 1; j <= n; j++) { // cout << " " << a[i][j]; // } // cout << endl; // } ksm(); n /= 2; for (i = 1; i <= n; i++) b[i][i + n]--; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (j != n) cout << b[i][j + n] << " "; else cout << b[i][j + n] << endl; } } return 0; }
以上是关于求和(矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj4887:[Tjoi2017]可乐 矩阵乘法,快速幂
POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂