R - self 同类分布
思路是用暴力枚举所有可能的数字和 然后逐一进行验证
此题需要判断两点,一是判断余数等于二是所有数字和等于设定的sum。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int bit[20];
ll dp[20][200][200];
ll dfs(int pos, int mod,int ss,int sum, int limit)//ss是各位数和,mod时余数
{
if (pos == -1)
return mod==0&&ss==sum;//两处判断
if (!limit && dp[pos][mod][ss] != -1)
return dp[pos][mod][ss];
int last = limit ? bit[pos] : 9;
ll tmp = 0;
for (int i = 0; i <= last; ++i)
{
tmp += dfs(pos - 1, (mod * 10 + i) % sum, ss+ i, sum, limit && (i == last));
}
if (!limit)
dp[pos][mod][ss] = tmp;
return tmp;
}
ll solve(ll x)
{
int len = 0;
memset(bit, 0, sizeof(bit));
while (x) {
bit[len++] = x % 10;
x /= 10;
}
ll ans = 0;
for (int i = 1; i <= 9 * len; ++i) {
memset(dp, -1, sizeof(dp));
ans+= dfs(len - 1, 0, 0, i, 1);
}
return ans;
}
int main()
{
ll n, m;
while (~scanf("%lld%lld", &n, &m)) {
printf("%lld\n", solve(m) - solve(n - 1));
}
return 0;
}