【Leetcode】2719. 统计整数数目

文章目录

题目

2719. 统计整数数目

给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数:
num1 <= x <= num2
min_sum <= digit_sum(x) <= max_sum.
请你返回好整数的数目。答案可能很大,请返回答案对 109 + 7 取余后的结果。
注意,digit_sum(x) 表示 x 各位数字之和。

示例一:
输入:num1 = “1”, num2 = “12”, min_num = 1, max_num = 8
输出:11
解释:总共有 11 个整数的数位和在 1 到 8 之间,分别是 1,2,3,4,5,6,7,8,10,11 和 12 。所以我们返回 11 。

示例二:
输入:num1 = “1”, num2 = “5”, min_num = 1, max_num = 5
输出:5
解释:数位和在 1 到 5 之间的 5 个整数分别为 1,2,3,4 和 5 。所以我们返回 5 。

提示:
1 <= num1 <= num2 <= 1022
1 <= min_sum <= max_sum <= 400

思路

这道题可以使用数位dp来解决,dp[i][j] 表示 i个数位之和小于等于j的情况数量,逐位递推即可,具体看这个 推理的过程
两种数位 DP 模板,附题单(Python/Java/C++/Go)

代码

constexpr int64_t mod = 1000000007;
constexpr int N = 22+1, M = N*9;
int64_t dp[N+1][M+1];
auto rb = [](auto x){return (x % mod + mod) % mod;};
auto _ = []{
    fill_n(dp[0], M+1, 1);
    for(int i = 1; i <= N; ++i){
        int64_t presum{};
        for(int j = 0; j <= M; ++j){
            presum += j >= 10 ? rb(dp[i-1][j] - dp[i-1][j-10]) : dp[i-1][j];
            dp[i][j] = presum = rb(presum);
        }
    }
    return 0;
}();
        
class Solution {
public:
    int count(string num1, string num2, int min_sum, int max_sum) {
        num1.back()--;
        min_sum--;
        max_sum = min(max_sum, M);
        min_sum = min(min_sum, M);
        for(int i = num1.size()-1; i >= 0 && num1[i] == '0'-1; --num1[--i]) num1[i] = '9';
        
        int n = num2.size();
        auto solve = [&](string num, int max_sum){
            int n = num.size(), sum = max_sum;
            int64_t ans = 0;
            for(int i = 0; i < n && sum >= 0; ++i){
                int x = num[i] - '0';
                for(int j = 0; j < x && j <= sum; ++j)
                    ans += dp[n-i-1][sum-j];
                sum -= x;
            }
            return rb(ans + (sum >= 0));
        };
        return rb(solve(num2, max_sum) - solve(num2, min_sum) - solve(num1, max_sum) + solve(num1, min_sum));
    }
};

相关推荐

  1. leetcode2719. 统计整数数目

    2024-01-17 11:58:04       34 阅读
  2. Leetcode2719. 统计整数数目

    2024-01-17 11:58:04       32 阅读
  3. [leetcode数位动态规划] 2719. 统计整数数目 hard

    2024-01-17 11:58:04       34 阅读
  4. leetcode-2719统计证书数目

    2024-01-17 11:58:04       40 阅读
  5. 2276. 统计区间中的整数数目

    2024-01-17 11:58:04       38 阅读
  6. leetcode--统计优美子数组

    2024-01-17 11:58:04       9 阅读
  7. 力扣2799.统计完全子数组的数目

    2024-01-17 11:58:04       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-17 11:58:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-17 11:58:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-17 11:58:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-17 11:58:04       20 阅读

热门阅读

  1. C++客户端服务器TCP创建

    2024-01-17 11:58:04       30 阅读
  2. 机器学习之泊松分布及均匀分布

    2024-01-17 11:58:04       29 阅读
  3. 1.3 面试经典150题 - 删除有序数组中的重复项

    2024-01-17 11:58:04       34 阅读
  4. 医院体检中心客户满意度抽样方法

    2024-01-17 11:58:04       36 阅读
  5. Linux 压缩解压

    2024-01-17 11:58:04       30 阅读
  6. C++中的指针、引用和数组

    2024-01-17 11:58:04       29 阅读
  7. JWT详解

    2024-01-17 11:58:04       31 阅读
  8. nginx配置中关于try_file的一些问题

    2024-01-17 11:58:04       29 阅读
  9. python-pip命令学习-改为国内镜像源

    2024-01-17 11:58:04       31 阅读