蒟蒻求助拣耽题
查看原帖
蒟蒻求助拣耽题
946909
Chase12345楼主2025/7/28 21:11

rt,矩阵快速幂 WA 了?

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

const i64 MOD = 7528443412579576937;

i64 mul(i64 a, i64 b) {
    i64 res = 0;
    a %= MOD;
    b %= MOD;
    for (; b; b >>= 1, a = (a + a) % MOD)
        if (b & 1)
            res = (res + a) % MOD;
    return res;
}

struct Matrix {
    i64 A[2][2];
    Matrix() {
        A[0][0] = A[0][1] = A[1][0] = A[1][1] = 0;
    }
    Matrix operator*(const Matrix &other) const {
        Matrix res;
        for (int i = 0; i < 2; ++i)
            for (int k = 0; k < 2; ++k)
                for (int j = 0; j < 2; ++j)
                    res.A[i][j] = (res.A[i][j] + mul(A[i][k], other.A[k][j])) % MOD;
        return res;
    }
};

Matrix pow_mat(Matrix a, i64 n) {
    Matrix res;
    res.A[0][0] = res.A[1][1] = 1;
    for (; n; n >>= 1, a = a * a)
        if (n & 1)
            res = res * a;
    return res;
}

i64 solve(i64 b, i64 d, i64 n) {
    if (n == 0) return 1;
    i64 delta = (b * b - d) / 4;
    Matrix mat;
    mat.A[0][0] = b;
    mat.A[0][1] = (MOD - delta) % MOD;
    mat.A[1][0] = 1;
    mat.A[1][1] = 0;
    mat = pow_mat(mat, n - 1);
    i64 kn = (mul(mat.A[0][0], b) + mul(mat.A[0][1], 2)) % MOD;
    if (n % 2 == 0 && b * b != d)
        kn = (kn - 1 + MOD) % MOD;
    return kn;
}

int main() {
    i64 b, d, n;
    cin >> b >> d >> n;
    cout << solve(b, d, n) << '\n';
    return 0;
}
2025/7/28 21:11
加载中...