fork(2) download
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>

#define int long long
using namespace std;
vector<int> num;
int a, b, k;
int dp[12][90][90][2];

int go(int pos, int val, int sum, int f) {
    if (pos == num.size()) {
        if (sum == 0 and val == 0)
            return 1;
        return 0;
    }

    int &res = dp[pos][val][sum][f];
    if (res != -1)
        return res;
    res = 0;
    int LMT;
    if (f == 0)
        LMT = num[pos];
    else
        LMT = 9;

    for (int dgt = 0; dgt <= LMT; dgt++) {
        int nf = f;
        if (f == 0 and dgt < LMT)nf = 1;
        res += go(pos + 1, (val * 10 + dgt) % k, (sum + dgt) % k, nf);
    }
    return res;
}


int solve(int a) {
    num.clear();
    while (a > 0)
        num.push_back(a % 10), a /= 10;
    reverse(num.begin(), num.end());

    memset(dp, -1, sizeof dp);
    return go(0, 0, 0, 0);
}

int32_t main() {

    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        cin >> a >> b >> k;
        int ans;
        if (k > 83)
            ans = 0;
        else ans = solve(b) - solve(a - 1);
        cout << "Case " << i << ": " << ans << endl;
    }
    return 0;
}
Success #stdin #stdout 0s 16752KB
stdin
3

1 20 1

1 20 2

1 1000 4

stdout
Case 1: 20
Case 2: 5
Case 3: 64