同态分布 给出两个数 a , b a,b a,b,求出 [ a , b ] [a,b] [a,b] 中各位数字之和能整除原数的数的个数。
数位 DP。 其实是水题,是常规操作,但我搞不出来。
由于各位和在变化,无法实时计算原数模各位和的值。因此我们枚举各位和,到达终点时,只有各位和真的为所枚举的数,才能算一种情况。
#include <cstdio>
#include <cstring>
#define F(z, u, v) for(int z = (u), D##z = (v); z <= D##z; ++z)
typedef long long LL;
LL dp[20][183][182]; char num[21];
LL Dfs(char* k, int sum, int p, int mod, bool lim) {
LL re = 0, &bl = dp[k - num][sum][p]; if(!*k) return sum == mod && !p;
if(!lim && ~bl) return bl;
F(i, '0', lim? *k: '9') re += Dfs(k + 1, sum + i - '0',
(10 * p + i - '0') % mod, mod, lim && i == *k);
return lim? re: bl = re; }
LL Ans(LL n) {
int lth = sprintf(num, "%lld", n); LL re = 0;
F(i, 1, lth * 9) memset(dp, -1, sizeof dp), re += Dfs(num, 0, 0, i, 1);
return re; }
int main() {
LL a, b; scanf("%lld%lld", &a, &b);
printf("%lld", Ans(b) - Ans(a - 1));
return 0; }