poj 3233 Matrix Power Series

来源:互联网 发布:开票软件服务费抵扣 编辑:程序博客网 时间:2024/05/16 06:27
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int N = 35;struct Matrix{        int m[N][N];};Matrix I;int n,k,M;Matrix add(Matrix a, Matrix b){        Matrix c;        for(int i = 0;i < n; i++){                for(int j = 0;j < n; j++){                        c.m[i][j] = a.m[i][j] + b.m[i][j];                        c.m[i][j] %= M;                }        }        return c;}Matrix multi(Matrix a, Matrix b){        Matrix c;        for(int i = 0;i < n; i++){                for(int j = 0;j < n; j++){                        c.m[i][j] = 0;                        for(int k = 0;k < n; k++)                                c.m[i][j] += a.m[i][k] * b.m[k][j];                        c.m[i][j] %= M;                }        }        return c;}Matrix pow(Matrix A, int n){        Matrix ans = I, p = A;        while(n > 0){                if(n & 1){                        ans = multi(ans, p);                                       }                n >>= 1;                p = multi(p, p);        }        return ans;}Matrix sum (Matrix A, int k){        if(k == 1) return A;        Matrix t = sum(A, k / 2);        if(k & 1){                Matrix cur = pow(A, k/2 + 1);                t = add(t, multi(t, cur));                t = add(t , cur);        }else{                Matrix cur = pow(A, k/2);                t = add(t , multi(t, cur));        }        return t;}int main(){        while(scanf("%d%d%d", &n, &k, &M) != EOF){                Matrix A;                for(int i = 0;i < n; i++){                        for(int j = 0;j < n; j++){                                scanf("%d", &A.m[i][j]);                                A.m[i][j] %= M;                                I.m[i][j] = (i == j);                        }                }                Matrix ans = sum(A, k);                for(int i = 0;i < n; i++){                        for(int j = 0;j < n; j++){                                printf("%d ", ans.m[i][j]);                        }                        printf("\n");                }                        }        return 0;}

0 0
原创粉丝点击