您的位置:首页 > 其它

POJ 3233 Matrix Power Series 【矩阵快速幂,矩阵加速】

2013-08-21 11:11 483 查看
| A+A^2+A^3+…Ak |   |A   A| (k-1)次方   | A |
|                | = |     |              |   |
|     E          |   |0   E|              | E |
A是输入的矩阵
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;#define N 66int n, a, Mod;//c = a*bvoid Multi(int a[], int b[], int c[]) {for (int i=0; i<n; i++)for (int j=0; j<n; j++) {c[i][j] = 0;for (int k=0; k<n; k++)c[i][j] = (c[i][j] + a[i][k]*b[k][j]) % Mod;}}//d = svoid copy(int d[], int s[]) {for (int i=0; i<n; i++) for (int j=0; j<n; j++)d[i][j] = s[i][j];}//a = a^k % Modvoid PowerMod(int a[], int b) {int t, ret;for (int i=0; i<n; i++) ret[i][i] = 1;while (b) {if (b & 1) { Multi(ret, a, t); copy(ret, t); }Multi(a, a, t); copy(a, t);b >>= 1;}copy(a, ret);}void print(int x[], int y) {for (int i=0; i<y; i++) {printf("%d", x[i][0]);for (int j=1; j<y; j++) printf(" %d", x[i][j]);printf("\n");}}int main() {int k;scanf("%d%d%d", &n, &k, &Mod);memset(a, 0, sizeof(a));for (int i=0; i<n; i++) for (int j=0; j<n; j++) scanf("%d", &a[i][j]);if (k > 1) {int m = n, b, c;memset(b, 0, sizeof(b));for (int i=0; i<n; i++) for (int j=0; j<n; j++) {a[i][j+n] = a[i][j];a[i+n][i+n] = 1;b[i][j] = a[i][j];b[i+n][i] = 1;}n = n*2;PowerMod(a, k-1);memset(c, 0, sizeof(c));for (int i=0; i<n; i++)for (int j=0; j<m; j++)for (int k=0; k<n; k++)c[i][j] = (c[i][j] + a[i][k]*b[k][j]) % Mod;print(c, n/2);} else print(a, n);return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: