挺裸的 ,只要注意到当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; }