POJ 3233 Matrix Power Series (矩阵快速幂)

来源:互联网 发布:ati备份 linux 编辑:程序博客网 时间:2024/04/30 00:22


点击打开链接

注意这里的A是一个矩阵 求T的次幂的时候图中是在做分块矩阵的乘法,但是计算机运算时要按照普通矩阵乘法来做,所以要先写出T。

最后求A+A^2+……+A^K是先求出T^(k+1)然后分割成四个分块矩阵,右上角的那个减去单位矩阵就是答案

#include<cstdio>#include<cstring>#include<string>using namespace std;struct matrix{int a[100][100];}base, ans;int n, k, m;matrix multiply(matrix x, matrix y){    matrix tmp;    for (int i = 0; i < 2*n; i++)        for (int j = 0; j < 2*n; j++)        {            tmp.a[i][j] = 0;            for (int k = 0; k < 2*n; k++)                tmp.a[i][j] = (tmp.a[i][j] + x.a[i][k] * y.a[k][j]) % m;        }    return tmp;}void fast_mod(int l){    while (l)    {        if (l & 1) ans = multiply(ans, base);        base = multiply(base, base);        l >>= 1;    }    for (int i = 0; i < n; i++)    {        for (int j = 0; j < n; j++)        {            if (i == j)            {                if (ans.a[i][j+n] == 0) ans.a[i][j+n] = m;                printf("%d ", ans.a[i][j+n]-1); // 这里容易出现bug            }            else printf("%d ", ans.a[i][j+n]);        }        printf("\n");    }}int main(){    scanf("%d%d%d", &n, &k, &m);    memset(base.a, 0, sizeof(base.a));    for (int i = 0; i < n; i++)        for (int j = 0; j < n; j++)        {            scanf("%d", &base.a[i][j]);            if (i == j) base.a[i][j+n] = 1;            if (i == j) base.a[i+n][j+n] = 1;        }    memset(ans.a, 0, sizeof(ans.a));    for (int i = 0; i < 2*n; i++)        ans.a[i][i] = 1;    fast_mod(k+1);    return 0;}

0 0