快速矩阵幂POJ3233

来源:互联网 发布:cg窝怎么样 知乎 编辑:程序博客网 时间:2024/04/29 19:15

给出n,k,m;n为矩阵A的行数和列数。然后输入矩阵A

求A^1+A^2+...A^k   全部mod m的矩阵。


#include<cstdio>int n,mod, k;struct Matrix{    int m[32][32];}E, Z;Matrix Mut(Matrix A, Matrix B){    Matrix ans;    for (int i = 0; i<n; i++)        for (int j = 0; j<n; j++)        {            ans.m[i][j] = 0;            for (int k = 0; k<n; k++)            {                ans.m[i][j] += ((A.m[i][k])*(B.m[k][j]));                ans.m[i][j] %= mod;            }        }    return ans;}Matrix Add(Matrix A, Matrix B){    Matrix ans;    for (int i = 0; i<n; i++)        for (int j = 0; j<n; j++)            ans.m[i][j] = (A.m[i][j] + B.m[i][j]) % mod;    return ans;}Matrix Pow(Matrix A, int b){    Matrix t = A, ans = E;    while (b)    {        if (b % 2) ans = Mut(ans, t);        b /= 2;        t = Mut(t, t);    }    return ans;}Matrix solve(Matrix A, int b){    if (b == 0) return E;    else if (b == 1) return A;    else if (b == 2) return Add(A, Mut(A, A));    else if (b % 2 == 1) return Add(Pow(A, b), solve(A, b - 1));    else if (b % 2 == 0)    {        Matrix ans = solve(A, b / 2);        Matrix C = Pow(A, b / 2);        Matrix B = Mut(ans, C);        return Add(B, ans);    }}int main(){    // freopen("in.txt", "r", stdin);Matrix A;   while(scanf("%d %d %d",&n,&k,&mod)!=EOF)   {         for (int i = 0; i<n; i++)            for (int j = 0; j<n; j++)                E.m[i][j] = (i == j);for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&A.m[i][j]);        Matrix ans = solve(A, k);for(int i=0;i<n;i++){for(int j=0;j<n;j++){printf("%d",ans.m[i][j]);if(j==n-1)printf("\n");else printf(" ");}}    }    return 0;}


0 0
原创粉丝点击