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;

}

 

你可能感兴趣的:(uva)