POJ-3233 二分+矩阵快速幂

POJ-3233

#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 31;
struct Matrix{
    int m[maxn][maxn];
};
 
int n, k, m;
 
Matrix mul(Matrix a, Matrix b){
    Matrix res;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            res.m[i][j] = 0;
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < n; k++){
                res.m[i][j] = (res.m[i][j] + (a.m[i][k] * b.m[k][j]) % m) % m;
            }
        }
    }
    return res;
}
 
Matrix poww(Matrix a, int k){
    Matrix tmp;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(i == j) tmp.m[i][j] = 1;
            else tmp.m[i][j] = 0;
        }
    }
    while(k){
        if(k & 1) tmp = mul(tmp, a);
        a = mul(a, a);
        k >>= 1;
    }
    return tmp;
}
 
Matrix add(Matrix a, Matrix b){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            a.m[i][j] = (a.m[i][j] + b.m[i][j]) % m;
        }
    }
    return a;
}
 
Matrix solve(Matrix a, int k){
    if(k == 1) return a;
    else {
        Matrix tmp = solve(a, k / 2);
        if(k & 1) return add(add(tmp, mul(poww(a, k / 2), tmp)), poww(a, k));
        else return add(tmp, mul(poww(a, k / 2), tmp));
    }
}
 
 
int main()
{
    Matrix a;
    cin >> n >> k >> m;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> a.m[i][j];
            a.m[i][j] %= m;
        }
    }
    Matrix ans = solve(a, k);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cout << ans.m[i][j] << ' ';
        }
        cout << endl;
    }
    return 0;
}
发布了54 篇原创文章 · 获赞 28 · 访问量 7298

猜你喜欢

转载自blog.csdn.net/jiangkun0331/article/details/97821904
今日推荐