uva11361数位dp

挺裸的 ,只要注意到当k超过9*10  就直接输出0就可以了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
using namespace std;

typedef long long LL;
LL dp[15][150][150];
LL k;
LL path[1000];

LL gao(LL x, LL sum, LL mod, LL flag)
{
    if (~dp[x][sum][mod]&&!flag) return  dp[x][sum][mod];
    if (x == 0){
        if (sum%k == 0 && mod == 0) return 1;
        else return 0;
    }
    LL  bound = flag ? path[x] : 9;
    LL ans = 0;
    for (LL i = 0; i <= bound; i++){
       // if((mod* 10+ i ) % k > 100) continue;
        ans += gao(x - 1, sum + i, (mod * 10 + i) % k, flag && (i == bound));
    }
    return flag?ans : dp[x][sum][mod] = ans;
}

LL solve(LL x)
{
    LL ret = 0;
    while (x){
        path[++ret] = x % 10;
        x /= 10;
    }
    return gao(ret, 0, 0, 1);
}



int main()
{
    LL a, b;
    LL Icase;
    cin >> Icase;
    while (Icase--){
        cin >> a >> b >> k;
        if(k>90){
            cout<<0<<endl;
            continue;
        }
        memset(dp,-1,sizeof(dp));
        cout << solve(b) - solve(a - 1) << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yigexigua/p/4018413.html