数位和为K的个数题解!!!
2025-03-20 17:38:03
发布于:广东
5阅读
0回复
0点赞
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int dp[10][46][2];
int L, R, k;
int dfs(int i, int sum, int isLimit) {
if (i == 0) return sum == k;
if (dp[i][sum][isLimit] != -1) return dp[i][sum][isLimit];
int up = isLimit ? (R / (int)pow(10, i - 1)) % 10 : 9;
int res = 0;
for (int d = 0; d <= up; d++) {
if (sum + d > k) break;
res += dfs(i - 1, sum + d, isLimit && (d == up));
}
dp[i][sum][isLimit] = res;
return res;
}
int count(int n, int k) {
R = n;
int len = to_string(R).length();
memset(dp, -1, sizeof(dp));
return dfs(len, 0, 1);
}
int main() {
cin >> L >> R >> k;
cout << count(R, k) - count(L - 1, k) << endl;
return 0;
}
这里空空如也
有帮助,赞一个