beautiful number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 851 Accepted Submission(s): 553
Total Submission(s): 851 Accepted Submission(s): 553
Problem Description
Let
A=∑ni=1ai∗10n−i(1≤ai≤9)(n
is the number of A's
digits). We call A
as “beautiful number” if and only if a[i
]≥a[i+1]
when 1≤i<n
and a[i
] mod
a[
j ]=0
when 1≤i≤n,i<j≤n(Such
as 931 is a "beautiful number" while 87 isn't).
Could you tell me the number of “beautiful number” in the interval [L,R ](including L and R)?
Could you tell me the number of “beautiful number” in the interval [L,R ](including L and R)?
Input
The fist line contains a single integer
T(about
100), indicating the number of cases.
Each test case begins with two integers L,R(1≤L≤R≤109).
Each test case begins with two integers L,R(1≤L≤R≤109).
Output
For each case, output an integer means the number of “beautiful number”.
Sample Input
2 1 11 999999993 999999999
Sample Output
10 2
数位dp
#include <cstring>
#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;
int num[15];
int dp[15][15];
///mark==1没前导0 mark==0有前导0
int dfs(int pos, int pre, int over, int mark)
{
if (pos < 0)
{
return 1;
}
if (dp[pos][pre] != -1 && !over)
{
return dp[pos][pre];
}
int last = over ? num[pos] : 9;
int ans = 0;
for (int i = 0; i <= last; i++)
{
if (mark == 0 || (pre >= i && i != 0 && pre % i == 0))
{
ans += dfs(pos - 1, i, over && i == last, mark || i);
}
}
if (!over)
{
dp[pos][pre] = ans;
}
return ans;
}
int solve(int n)
{
int len = 0;
while (n)
{
num[len++] = n % 10;
n /= 10;
}
return dfs(len - 1, 0, true, 0);
}
int main()
{
int t;
scanf("%d", &t);
memset(dp, -1, sizeof(dp));
while (t--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", solve(r) - solve(l - 1));
}
}