It's bare. You only need to note that when K exceeds 9*10, 0 is output directly.
#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 digital DP