首页 > 代码库 > uva11361数位dp

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;}

 

uva11361数位dp