dp[i][e],表示i位数,最高位为e,符合题目条件的数的个数,然后数位dp
/*************************************************************************
> File Name: hdu5179.cpp
> Author: ALex
> Mail: [email protected]
> Created Time: 2015年03月01日 星期日 12时56分21秒
************************************************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
int dp[12][12];
int bit[12];
int cnt;
int dfs(int cur, int e, bool flag, bool zero)
{
if (cur == -1)
{
if (zero)
{
return 0;
}
return 1;
}
if (!flag && ~dp[cur][e])
{
return dp[cur][e];
}
int ans = 0;
int end = flag ? bit[cur] : 9;
for (int i = 0; i <= end; ++i)
{
if (zero && !i)
{
ans += dfs (cur - 1, 0, flag && (i == end), 1);
}
else if (zero && i)
{
ans += dfs (cur - 1, i, flag && (i == end), 0);
}
else
{
if (cnt - 1 == cur)
{
ans += dfs (cur - 1, i, flag && (i == end), 0);
}
else if (i && e % i == 0)
{
ans += dfs (cur - 1, i, flag && (i == end), 0);
}
}
}
if (!flag)
{
dp[cur][e] = ans;
}
return ans;
}
int calc (int n)
{
cnt = 0;
while (n)
{
bit[cnt++] = n % 10;
n /= 10;
}
return dfs (cnt - 1, 0, 1, 1);
}
int main ()
{
int t;
memset (dp, -1, sizeof(dp));
scanf("%d", &t);
while (t--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", calc (r) - calc (l - 1));
}
return 0;
}
时间: 2024-10-31 16:45:12