当前位置: 首页 > news >正文

Kimi k2.6 LeetCode 2999. 统计强大整数的数目 C++实现

以下是 LeetCode 2999. 统计强大整数的数目 的 C++ 实现,采用数位 DP(Digit DP)思路。

核心思路

强大整数的条件:
1. 后缀必须是 `s`
2. 每个数位都不超过 `limit`

利用容斥原理:`[start, finish]` 内的强大整数个数 = `[0, finish]` 内的个数 − `[0, start-1]` 内的个数。

C++ 代码

```cpp
class Solution {
public:
long long numberOfPowerfulInt(long long start, long long finish, int limit, string s) {
this->s = s;
this->limit = limit;

// 计算 [0, start-1] 内的强大整数个数
t = to_string(start - 1);
memset(f, -1, sizeof(f));
long long a = dfs(0, true);

// 计算 [0, finish] 内的强大整数个数
t = to_string(finish);
memset(f, -1, sizeof(f));
long long b = dfs(0, true);

return b - a;
}

private:
string s; // 后缀
string t; // 当前上界数字的字符串
long long f[20]; // 记忆化数组,-1 表示未计算
int limit; // 数位上限

/**
* 数位 DP:计算小于等于 t 的强大整数个数
* @param pos 当前处理到的位置
* @param lim 是否受上界 t 的约束(tight)
*/
long long dfs(int pos, bool lim) {
// 如果上界 t 的长度比后缀 s 还短,不可能有以 s 为后缀的数
if (t.length() < s.length()) {
return 0;
}

// 不受 tight 约束时,可以用记忆化
if (!lim && f[pos] != -1) {
return f[pos];
}

// 到达后缀区域:剩余长度恰好等于 s 的长度
if (t.length() - pos == s.length()) {
// 如果受 tight 约束,需要判断后缀 s 是否 <= t 的剩余部分
return lim ? (s.compare(t.substr(pos)) <= 0 ? 1 : 0) : 1;
}

// 当前位可选的上限
int up = lim ? t[pos] - '0' : 9;
up = min(up, limit);

long long ans = 0;
for (int i = 0; i <= up; i++) {
// 继续递归下一位,更新 tight 状态
ans += dfs(pos + 1, lim && i == (t[pos] - '0'));
}

// 记忆化:只有不受 tight 约束时才存储
if (!lim) {
f[pos] = ans;
}
return ans;
}
};
```

关键点说明

要点 说明
容斥原理 `count(finish) - count(start-1)` 得到区间答案
后缀处理 当剩余长度等于 `s.length()` 时,进入强制匹配后缀的逻辑
tight 约束 `lim=true` 表示当前构造的前缀与上界 `t` 完全相同,下一位不能超过 `t` 的对应位
记忆化 只有 `lim=false`(不受 tight 约束)时才缓存结果,`lim=true` 时结果与具体上界相关
数位上限 每位可选 `0` 到 `min(limit, 上界对应位)`,同时满足 `limit` 和 `tight` 两个约束

复杂度分析

- 时间复杂度:O(\log M \times D),其中 M 是数值上界(最大 10^{15}),D = 10 为可选数字个数。实际由于记忆化,状态数约为 O(\log M)。
- 空间复杂度:O(\log M),用于记忆化数组和递归栈。

http://www.cnnetsun.cn/news/2757905.html

相关文章:

  • 自动化AI算法训练服务器DLTM零代码私有化一站式AI训练平台技术解析
  • SoybeanAdmin:重新定义企业级管理后台的开发体验
  • 如何快速掌握免费音乐歌词获取工具:面向音乐爱好者的完整使用指南
  • 易语言乐玩插件实战:用《剑侠情缘》多开挂机,手把手教你多线程绑定窗口(附源码)
  • Go 协程调度探秘:GMP 模型中的 G-P 隐形逃逸机制
  • 10. 向量数据库中 IVF 与 HNSW 索引对 Milvus向量数据库分区分片设计 检索召回与物理延时的权衡选择细节
  • LosslessCut终极指南:如何使用智能剪辑实现帧级精确视频切割
  • SMO算法调参实战:用sklearn的SVC时,如何理解并优化关键参数C和gamma?
  • 雀魂牌谱分析工具:数据驱动的麻将水平提升指南
  • AirSim Python API避坑指南:1.3.1版本中那些官方没细说的细节与性能优化
  • 基于Arduino的PKE造型盖革计数器:DIY辐射探测与复古科幻融合
  • 从‘BA’到‘WE’:手把手教你读懂SAP MRP运行结果里的那些神秘代码
  • 城市社区基层治理一网统管智能服务平台技术方案
  • Steam挂刀行情站:24小时实时监控四大平台饰品价格的完整指南
  • 2026年人像抠图换背景一看就会:免费工具推荐+手把手教程
  • Qwen3.6-Plus实战指南:高吞吐、低延迟、细粒度计费的大模型工程落地
  • 从零到部署:基于快马ai在ubuntu上快速构建可运行的个人博客系统实战
  • MATLAB多用户MIMO下行预编码实现:块对角化干扰抑制方案
  • 告别内核驱动:在ZYNQ用户空间用UIO处理AXI GPIO中断的完整指南
  • |____2.7 FreeRTOS 深度解析--消息队列
  • 告别EV2400:用一块STM32F407开发板搞定BQ40Z50电池数据监控(含电压、电量读取)
  • OpenSora-STDiT-v2-stage3实战教程:用NPU加速生成高质量视频的完整流程
  • Spring Cloud 微服务高并发网关:Java 反射与字节码插桩技术的动态路由安全机制
  • S7-1200_1500 PLC学习程序分享-动态加密计时催款程序
  • Kimi K2.5 Agent集群:知识生产的流水线革命
  • GPT-4o实战指南:从API调用到工程级优化
  • Windows HEIC缩略图插件:跨平台图像兼容性的技术突破与实现
  • 终极实战指南:mootdx Python通达信数据读取工具完整解析与高效应用
  • 构建企业级大疆无人机固件管理系统的完整技术解决方案
  • MiniCPM-V-4-GPTQ安全与优化:确保模型稳定运行的10个最佳实践