[LibreOJ - 10166] 数字游戏
题目链接
大致题意:
统计区间内,取模数的个数
取模数:这种数字必须满足各位数字之和 mod N 为 0
解题思路:
我们需要参数sum记录每一位数字和
当递归到最低位时,判断sum是否可以对N取模即可,累加结果
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 30;
int n;
int a[N];
ll f[N][N * 10];
ll dfs(int pos, int limit, int sum) {
if (!pos)return sum % n == 0;
if (!limit && f[pos][sum] != -1)return f[pos][sum];
ll res = 0;
int end = limit ? a[pos] : 9;
for (int i = 0; i <= end; ++i) {
res += dfs(pos - 1, limit && i == end, sum + i);
}
if (!limit)f[pos][sum] = res;
return res;
}
ll dp(ll x) {
memset(f, -1, sizeof f);
int len = 0;
while (x) a[++len] = x % 10, x /= 10;
return dfs(len, 1, 0);
}
int main(void)
{
ll l, r;
while (cin >> l >> r >> n)
cout << (dp(r) - dp(l - 1)) << endl;
return 0;
}