矩阵快速幂 50 分求调
查看原帖
矩阵快速幂 50 分求调
755759
zhujiangyuan楼主2024/6/30 11:29

做法: 矩阵乘法中做矩阵乘法。

WA 50 pts。

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
const int N = 35;
int n, m, k;
struct SQ { int q[N][N]; };
SQ mul2 (SQ d, SQ a, SQ b) {
    SQ c;
    memset (c.q, 0, sizeof c.q);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int k = 0; k < n; k++)
                c.q[i][j] = (c.q[i][j] + a.q[i][k] * b.q[k][j] % m) % m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            d.q[i][j] = (d.q[i][j] + c.q[i][j]) % m;
    return d;
}
void mul (SQ s[2], SQ a[2][2]) {
    SQ c[2];
    for (int i = 0; i < 2; i++) memset (c[i].q, 0, sizeof c[i].q);
    for (int j = 0; j < 2; j++)
        for (int k = 0; k < 2; k++) {
            c[j] = mul2 (c[j], s[k], a[k][j]);
        }
    memcpy (s, c, sizeof c);
}
void mulself (SQ a[2][2]) {
    SQ c[2][2];
    for (int i = 0; i < 2; i++)
    	for (int j = 0; j < 2; j++)
			memset (c[i][j].q, 0, sizeof c[i][j].q);
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 2; j++)
            for (int k = 0; k < 2; k++)
                c[i][j] = mul2 (c[i][j], a[i][k], a[k][j]);
    memcpy (a, c, sizeof c);
}
signed main ()
{
    ios::sync_with_stdio (false);
    cin.tie (0); cout.tie (0);
    
    SQ s[2], a[2][2];
    cin >> n >> k >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            cin >> s[1].q[i][j]; s[1].q[i][j] %= m;
            if (i == j) a[1][0].q[i][j] = a[1][1].q[i][j] = 1;
            a[0][0].q[i][j] = s[1].q[i][j];
        }
    for (; k; k >>= 1) {
        if (k & 1) mul (s, a);
        mulself (a);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << s[0].q[i][j] << ' ';
        cout << '\n';
    }
    return 0;
}
2024/6/30 11:29
加载中...