题目链接: Beautiful Numbers
大致题意:
求出1到n之间有多少个数是他本身对位数总和取余为0
解题思路:
数位dp
数据是1e12,位数总和也就12*9,枚举位数和,累加结果
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int sum;
ll f[15][120][120]; //位数 总和 余数
int num[15];
ll dfs(int pos, int state, int mod, int limit) {//位数 总和 余数 限制
if (pos == -1)return state == sum && mod == 0;
if (!limit && f[pos][state][mod] != -1)return f[pos][state][mod];
ll ans = 0;
int end = limit ? num[pos] : 9;
for (int i = 0; i <= end; ++i) {
if (state + i > sum)break; //剪枝
ans += dfs(pos - 1, state + i, (mod * 10 + i) % sum, limit && i == end);
}
if (!limit)f[pos][state][mod] = ans;
return ans;
}
ll dp(ll n) {
int len = 0;
while (n)num[len++] = n % 10, n /= 10;
int tmp = 9 * len;
ll ans = 0;
for (int i = 1; i <= tmp; ++i) { //枚举所有总和
memset(f, -1, sizeof f);
sum = i;
ans += dfs(len - 1, 0, 0, 1);
}
return ans;
}
int main() {
int t; cin >> t;
for (int i = 1; i <= t; ++i) {
cin >> n;
printf("Case %d: %lld\n", i, dp(n));
}
return 0;
}