HDU3709

来源:互联网 发布:淘宝店铺关注怎么刷 编辑:程序博客网 时间:2024/05/21 08:56

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709

ull dfs(int len, int piovt, int sum, bool limit),目前处理到第len位,第piovt 为支点,目前的和为sum,是否受到限制。

枚举每一位作为支点,累加  dfs(len, i, 0, true)

#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long ull;ull dp[20][20][2005];int digit[20];ull dfs(int len, int piovt, int sum, bool limit){    if (len == 0){        return sum == 0;    }    if (sum < 0){        return 0;    }    if (!limit && dp[len][piovt][sum] != -1){        return dp[len][piovt][sum];    }    int Max = limit ? digit[len] : 9;    ull ret = 0;    for (int i=0; i<=Max; i++){        ret += dfs(len-1, piovt, sum+(len-piovt)*i, limit&&(i==Max));    }    if (!limit){        dp[len][piovt][sum] = ret;    }    return ret;}ull calc(ull n){    if (n < 0){        return 0;    }    int len = 0;    while (n > 0){        digit[++len] = n % 10;        n /= 10;    }    ull ret = 0;    for (int i=1; i<=len; i++){        ret += dfs(len, i, 0, true);    }    return ret-(len-1);}int main(){    int t;    ull n, m;    scanf("%d", &t);    memset(dp, -1, sizeof(dp));    while (t > 0){        t--;        scanf("%I64d%I64d", &n,&m);        printf("%I64d\n",calc(m)-calc(n-1));    }    return 0;}


0 0
原创粉丝点击