1 条题解

  • 0
    @ 2025-10-22 18:08:02

    题解

    题目分析

    这是一道算法题目,需要根据具体题目要求进行求解。

    解题思路

    1. 问题分析

    • 仔细阅读题目描述,理解题目要求
    • 分析输入输出格式和约束条件
    • 确定需要使用的算法和数据结构

    2. 算法选择

    • 根据题目特点选择合适的算法
    • 考虑时间复杂度和空间复杂度
    • 确保算法能正确处理所有测试用例

    3. 实现要点

    • 注意边界条件的处理
    • 优化输入输出以提高效率
    • 确保代码的正确性和鲁棒性

    4. 调试和优化

    • 使用测试用例验证算法正确性
    • 分析性能瓶颈并进行优化
    • 确保代码能通过所有测试点

    注意事项

    • 仔细处理数据类型和精度问题
    • 注意数组越界和空指针问题
    • 确保算法的时间复杂度符合要求
    #pragma GCC optimize("2,3,Ofast,inline,unroll-loops,-ffast-math")
    #include <bits/stdc++.h>
    using namespace std;
    
    using i64 = long long;
    template<class T>
    constexpr T power(T a, i64 b) {
        T res = 1;
        for (; b; b /= 2, a *= a) {
            if (b % 2) {
                res *= a;
            }
        }
        return res;
    }
    
    template<int P>
    struct MInt {
        int x;
        constexpr MInt() : x{} {}
        constexpr MInt(i64 x) : x{norm(x % getMod())} {}
        
        static int Mod;
        constexpr static int getMod() {
            if (P > 0) {
                return P;
            } else {
                return Mod;
            }
        }
        constexpr static void setMod(int Mod_) {
            Mod = Mod_;
        }
        constexpr int norm(int x) const {
            if (x < 0) {
                x += getMod();
            }
            if (x >= getMod()) {
                x -= getMod();
            }
            return x;
        }
        constexpr int val() const {
            return x;
        }
        explicit constexpr operator int() const {
            return x;
        }
        constexpr MInt operator-() const {
            MInt res;
            res.x = norm(getMod() - x);
            return res;
        }
        constexpr MInt inv() const {
            assert(x != 0);
            return power(*this, getMod() - 2);
        }
        constexpr MInt &operator*=(MInt rhs) & {
            x = 1LL * x * rhs.x % getMod();
            return *this;
        }
        constexpr MInt &operator+=(MInt rhs) & {
            x = norm(x + rhs.x);
            return *this;
        }
        constexpr MInt &operator-=(MInt rhs) & {
            x = norm(x - rhs.x);
            return *this;
        }
        constexpr MInt &operator/=(MInt rhs) & {
            return *this *= rhs.inv();
        }
        friend constexpr MInt operator*(MInt lhs, MInt rhs) {
            MInt res = lhs;
            res *= rhs;
            return res;
        }
        friend constexpr MInt operator+(MInt lhs, MInt rhs) {
            MInt res = lhs;
            res += rhs;
            return res;
        }
        friend constexpr MInt operator-(MInt lhs, MInt rhs) {
            MInt res = lhs;
            res -= rhs;
            return res;
        }
        friend constexpr MInt operator/(MInt lhs, MInt rhs) {
            MInt res = lhs;
            res /= rhs;
            return res;
        }
        friend constexpr std::istream &operator>>(std::istream &is, MInt &a) {
            i64 v;
            is >> v;
            a = MInt(v);
            return is;
        }
        friend constexpr std::ostream &operator<<(std::ostream &os, const MInt &a) {
            return os << a.val();
        }
        friend constexpr bool operator==(MInt lhs, MInt rhs) {
            return lhs.val() == rhs.val();
        }
        friend constexpr bool operator!=(MInt lhs, MInt rhs) {
            return lhs.val() != rhs.val();
        }
    };
    
    constexpr int P = 998244353;
    using Z = MInt<P>;
    
    const int N = 10 + 5, M = 170 + 5;
    
    int T, m, K, S, id[N][N][N];
    Z tmp[M], ans[M], Inv[N];
    
    struct Matrix {
        Z a[M][M];
        Z* operator[](int x) {
            return a[x];
        }
    } f[M];
    
    Matrix operator*(Matrix x, Matrix y) {
        Matrix z;
        for (int i = 0; i <= S + 1; i++)
            for (int j = 0; j <= S + 1; j++) {
                z[i][j] = 0;
                for (int k = 0; k <= S + 1; k++)
                    z[i][j] += x[i][k] * y[k][j];
            }
        return z;
    }
    
    signed main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
        cin >> T >> m >> K;
        for (int i = 0; i <= K; i++)
            for (int j = 0; j <= (m > 1) * (K - i); j++)
                for (int k = 0; k <= (m > 2) * (K - i - j); k++)
                    id[i][j][k] = ++S;
        for (int i = 0; i <= K; i++) {
            for (int j = 0; j <= (m > 1) * (K - i); j++) {
                for (int k = 0; k <= (m > 2) * (K - i - j); k++) {
                    int D = (i + j + k < K);
                    if (m == 1) {
                        if (i) f[0][id[i][j][k]][id[i - 1][j][k]] = (Z)i / (i + j + k + 1);
                    } else if (m == 2) {
                        if (i) f[0][id[i][j][k]][id[i - 1][j][k]] = (Z)i / (i + j + k + 1);
                        if (j) f[0] [id[i][j][k]][id[i + 1][j - 1 + D][k]] = (Z)j / (i + j + k + 1);
                    } else if (m == 3) {
                        if (i) f[0][id[i][j][k]][id[i - 1][j][k]] = (Z)i / (i + j + k + 1);
                        if (j) f[0][id[i][j][k]][id[i + 1][j - 1][k + D]] = (Z)j / (i + j + k + 1);
                        if (k) f[0][id[i][j][k]][id[i][j + 1][k - 1 + D]] = (Z)k / (i + j + k + 1);
                    }
                    f[0][id[i][j][k]][id[i][j][k]] = f[0][id[i][j][k]][S + 1] = (Z)1 / (i + j + k + 1);
                }
            }
        }
        f[0][S + 1][S + 1] = 1;
        for (int i = 1; i <= 60; i++)
            f[i] = f[i - 1] * f[i - 1];
        while (T--) {
            long long n;
            cin >> n;
            for (int i = 0; i <= S + 1; i++)
                ans[i] = 0;
            ans[id[m == 1][m == 2][m == 3]] = 1;
            for (int i = 0; i <= 60; i++) {
                if ((n >> i) & 1) {
                    for (int j = 0; j <= S + 1; j++) {
                        tmp[j] = 0;
                        for (int k = 0; k <= S + 1; k++)
                            tmp[j] += ans[k] * f[i][k][j];
                    }
                    for (int j = 0; j <= S + 1; j++)
                        ans[j] = tmp[j];
                }
            }
            cout << ans[S + 1] << '\n';
        }
        return 0;
    }
    
    • 1

    「清华集训 2017」小 Y 和恐怖的奴隶主

    信息

    ID
    3777
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者