错误代码

版权声明: https://blog.csdn.net/qq_40829288/article/details/89443229

错误代码

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 31;
int n, k, mod;

struct mat {
    int arr[maxn][maxn];

    mat() {
        memset(arr, 0, sizeof(arr));
    }
};

mat add(mat a, mat b) {
    mat c;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            c.arr[i][j] = a.arr[i][j] + b.arr[i][j];
            if (c.arr[i][j] >= mod) {
                c.arr[i][j] %= mod;
            }
        }
    }
    return c;
}

mat mul(mat a, mat b) {
    mat ret;
    for (int i = 0; i < n; i++) {
        for (int k = 0; k < n; k++) {
            if (a.arr[i][k]) {
                for (int j = 0; j < n; j++) {
                    ret.arr[i][j] += a.arr[i][k] * b.arr[k][j];
                    if (ret.arr[i][j] >= mod)
                        ret.arr[i][j] %= mod;
                }
            }
        }
    }
    return ret;
}

mat power(mat p, int k) {
    if (k == 1)
        return p;
    mat e;
    for (int i = 0; i < n; i++) {
        e.arr[i][i] = 1;
    }
    if (k == 0)
        return e;
    while (k) {
        if (k & 1)
            e = mul(p, e);
        p = mul(p, e);
        k >>= 1;
    }
    return e;
}

mat cal(mat ori, int k) {
    if (k == 1) {
        return ori;
    }
    if (k & 1) {
        return add(cal(ori, k - 1), power(ori, k));
    }
    return mul(add(power(ori, 0), power(ori, k >> 1)), cal(ori, k >> 1));
}

//void output(mat ans) {
//    for(int i = 0;i < n;i++) {
//        for(int j = 0;j < n;j++) {
//            if(j<n-1) {
//                printf("%d ",ans.arr[i][j]);
//            } else {
//                printf("%d\n",ans.arr[i][j]);
//            }
//        }
//    }
//}

void output(mat ans) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (j == n - 1)
                cout << ans.arr[i][j] << endl;
            else
                cout << ans.arr[i][j] << " ";
        }
}

int main() {
    mat ori, ans;
    while (scanf("%d%d%d", &n, &k, &mod) != EOF) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &ori.arr[i][j]);
                if (ori.arr[i][j] >= mod) {
                    ori.arr[i][j] %= mod;
                }
            }
        }
        ans = cal(ori, k);
        output(ans);
    }
    return 0;
}
posted @ 2019-04-21 21:56 Youpeng 阅读( ...) 评论( ...) 编辑 收藏

猜你喜欢

转载自blog.csdn.net/qq_40829288/article/details/89443229