题意:一个递减数,并且要求上一位对下一位求余==0的一个数,就是一个beautiful number、问区间内有多少这种数。
注意dp的初始化,以及lead起着前导0的作用。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
int a[20];
int dp[20][20];
int DFS(int pos, int pre, bool lead, bool limit) {
if (pos == -1)
return 1;
if (!limit && !lead && dp[pos][pre] != -1)
return dp[pos][pre];
int up = limit ? a[pos] : 9;
int res = 0;
for (int i = 0; i <= up; i++) {
if (lead || pre >= i && i != 0 && pre%i == 0) {
res += DFS(pos - 1, i, lead && i == 0, limit&&i == a[pos]);
}
}
if (!limit && !lead)
dp[pos][pre] = res;
return res;
}
int solve(int x) {
int pos = 0;
while (x) {
a[pos++] = x % 10;
x /= 10;
}
return DFS(pos - 1, -1, true, true);
}
int main() {
int L, R;
int t;
scanf("%d", &t);
memset(dp, -1, sizeof(dp));
while (t--) {
scanf("%d%d", &L, &R);
int ans = solve(R) - solve(L - 1);
printf("%d\n", ans);
}
return 0;
}