1 条题解

  • 0
    @ 2026-11-2 13:31:49

    同类分布(Same Distribution) 题解

    思路分析

    按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    string s;
    int targetSum;
    long long memo[20][170][170];
    
    long long dfs(int pos, int curSum, int rem, bool tight) {
        if (curSum > targetSum) return 0;
        if (pos == (int)s.size()) {
            return (curSum == targetSum && rem == 0) ? 1 : 0;
        }
        if (!tight && memo[pos][curSum][rem] != -1) return memo[pos][curSum][rem];
        int up = tight ? (s[pos] - '0') : 9;
        long long res = 0;
        for (int d = 0; d <= up; ++d) {
            if (curSum + d + 9 * ((int)s.size() - 1 - pos) < targetSum) continue;
            res += dfs(pos + 1, curSum + d, (rem * 10 + d) % targetSum, tight && (d == up));
        }
        if (!tight) memo[pos][curSum][rem] = res;
        return res;
    }
    
    long long solve(long long x) {
        if (x <= 0) return 0;
        s = to_string(x);
        int maxS = 9 * (int)s.size();
        long long ans = 0;
        for (targetSum = 1; targetSum <= maxS; ++targetSum) {
            for (int i = 0; i <= (int)s.size(); ++i) {
                for (int j = 0; j <= targetSum; ++j) {
                    for (int r = 0; r < targetSum; ++r) {
                        memo[i][j][r] = -1;
                    }
                }
            }
            ans += dfs(0, 0, 0, true);
        }
        return ans;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        long long a, b;
        if (!(cin >> a >> b)) return 0;
        cout << solve(b) - solve(a - 1) << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    8702
    时间
    3000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者