hdu5179---beautiful number

5792 단어 dp
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
"
, calc (r) - calc (l - 1)); } return 0; }

좋은 웹페이지 즐겨찾기