要求[l, r] 区间内有多少数符合两个条件:
1)数可以整除k
2)这个数的所有位之和可以整除k
思路 : 数位dp其中一个参数存所有数位相加模k的值,另一个参数存这个当前数模k的值.
当k > 90时,因为所有位之和最大为90,所以不存在整除k的值,直接输出0.
/***********************************************
* Author: fisty
* Created Time: 2015-08-26 11:57:26
* File Name : 1068.cpp
*********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define lson l, m, k<<1
#define rson m+1, r, k<<1|1
int t;
int l, r, k;
#define MAX_N 12
int digit[MAX_N];
LL dp[MAX_N][MAX_N*9][MAX_N*9];
LL dfs(int len, int mod, int sum, int e){
if(len < 0) return mod == 0 && sum == 0;
if(!e && dp[len][mod][sum] != -1){
return dp[len][mod][sum];
}
LL ans = 0;
int d = e ? digit[len] : 9;
for(int i = 0;i <= d; i++){
ans += dfs(len-1, (mod * 10 + i) % k,(sum + i) % k, e && i == d);
}
if(!e)
dp[len][mod][sum] = ans;
return ans;
}
LL solve(int n){
int len = 0;
Memset(digit, 0);
while(n){
digit[len++] = n % 10;
n /= 10;
}
LL ans = dfs(len-1, 0, 0, 1);
return ans;
}
int main() {
//freopen("in.cpp", "r", stdin);
//cin.tie(0);
//ios::sync_with_stdio(false);
scanf("%d", &t);
int cnt = 1;
while(t--){
Memset(dp, -1);
scanf("%d%d%d", &l, &r, &k);
if(k >= 90){
printf("Case %d: 0\n", cnt++);
continue;
}
printf("Case %d: %d\n",cnt++, solve(r) - solve(l-1));
}
return 0;
}