数位dp中的前导0处理 AcWing 1084. 数字游戏 II
若数位dp中的数字性质要求数字不含前导0,则可以考虑。
dp数组中保留存在前导0的数字种类。
在遍历每一位时,第一位从1开始,其他位从0开始。
然后再把位数低于当前数字的结果(不含前导0)累加。
(含有前导0时,则可以遍历每一位时都从0开始,最后也不用累加结果)
(如果数字是否含有前导0对结果(数字的性质)不影响,则两种方法均可,比如1082数字游戏,前导0就会影响,1084数字游戏II就不会影响)
AcWing 1084. 数字游戏 II

#include<bits/stdc++.h> using namespace std; typedef long long LL; LL a, b, mod; LL dp[10][15][100];//digit len remain LL sum[15]; LL Count(LL num) { string str = to_string(num); LL res = 0; LL last = 0; for (int i = 0; i < str.size(); i++) { int num = str[i] - '0'; for (int j = (i==0); j < num; j++) res += dp[j][str.size()-i][(mod - (last) % mod)%mod]; last += num; } if (last%mod == 0) res++; for (int i = 1; pow(10, i) <= num; i++) res += sum[i]; return res; } void YD() { while (cin >> a >> b >> mod) { memset(dp, 0, sizeof(dp)); memset(sum, 0, sizeof(sum)); for (int i = 0; i < 10; i++) dp[i][1][i%mod] = 1; for (int len = 2; len <= 10; len++) { for (int i = 0; i < 10; i++) { for (int r = 0; r < mod; r++) { for (int j = 0; j < 10; j++) { dp[i][len][r] += dp[j][len - 1][(r + 2 * mod - i) % mod]; } } } } for (int i = 1; i <= 10; i++) { for (int j = 1; j < 10; j++) sum[i] += dp[j][i][0]; } sum[1] += dp[0][1][0]; cout << Count(b) - Count(a - 1) << endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T = 1; //cin >> T; while (T--) { YD(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人