当前位置: 首页 > 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.jsqmd.com/news/951895/

相关文章:

  • 2026 年字节 AI 多线作战:世界模型、Coding、视频模型、豆包商业化谁能突围?
  • Halcon区域处理三剑客:region_to_bin、label、mean到底怎么选?附完整代码示例
  • 量化交易+大模型决策闭环构建全路径(从ChatGPT接入到实盘风控落地)
  • Kimi k2.6 LeetCode 3003. 执行操作后的最大分割数量 Java实现
  • AntiDupl.NET图片去重终极指南:快速清理重复图片的完整教程
  • 效率提升:用快马AI自动化工具快速处理付款未获批准事项
  • 3步开启你的浏览器PPT创作革命:PPTist在线演示文稿完全指南
  • 如何3分钟告别手动刷课:智慧职教自动化学习助手完整指南
  • COM3D2终极实时编辑器:5分钟掌握游戏角色属性修改技巧
  • Kimi k2.6 LeetCode 3003. 执行操作后的最大分割数量 Go实现
  • 别再死记硬背!一个‘顾客到达’的例子,彻底搞懂复合泊松过程的期望与方差推导
  • 告别重复造轮子:用快马一键生成gptimage2安卓版高效开发模板
  • 实战指南:基于快马ai快速开发can总线监控与诊断上位机软件
  • 五步构建完美黑苹果系统:OpenCore引导配置完全指南
  • DankDroneDownloader:无人机固件自由与历史版本恢复的终极解决方案
  • AI注销不是删除,而是智能遗忘:解析联邦学习+差分隐私双引擎注销架构(附开源POC代码)
  • 三分钟破解Axure语言障碍:中文界面本地化实战方案
  • 融资超500亿!DeepSeek估值逼近600亿美元,腾讯宁德时代争相入局
  • [特殊字符] 拼多多大厂笔试题——正则表达式
  • 2026年中央空调清洗公司推荐哪些?商业楼宇空调系统清洗选型指南 - 华旭传媒
  • 实战应用:基于快马平台开发带历史记录与偏好设置的夺命许愿软件
  • 如何快速掌握免费音乐歌词获取工具:面向音乐爱好者的完整使用指南
  • SWAT模型实战踩坑记:.sol文件为空、气象数据缺失?手把手教你诊断与修复
  • Kimi k2.6 LeetCode 2972. 统计移除递增子数组的数目 II Python3实现
  • SourceGit:让Git版本控制变得直观高效的跨平台图形化解决方案
  • 智慧教育平台电子课本一键解析:告别繁琐下载的智能解决方案
  • 新手福音:用快马平台生成练习项目,轻松理解github协作开发
  • 【会议征稿通知 | 中国教育发展战略学会教育大数据专业委员会主办 | SPIE出版 | EI 、Scopus稳定检索】第六届先进算法与信号、图像处理国际学术会议(AASIP 2026)
  • 别再怕约束了!手把手教你用QUBO模型把复杂优化问题‘拍扁’成无约束问题
  • 【深度解析】Gemma 4 12B:面向本地 Agent 工作流的统一多模态模型与 OpenAI 兼容接入实践