题意:给出区间[A,B]一个数K。求区间中能被K整数且各位数字之和也能被K整除的数的个数。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int a[33];
int dp[33][103][103];
int k;
int dfs(int len, int mod1, int mod2, bool lim) {
if(!len) return !mod1 && !mod2;
if(!lim && ~dp[len][mod1][mod2]) return dp[len][mod1][mod2];
int m = lim ? a[len-1] : 9;
int ret = 0;
int i;
for(i = 0; i <= m; i++)
ret += dfs(len-1, (mod1*10+i)%k, (mod2+i)%k, lim&&i==m);
if(!lim) dp[len][mod1][mod2] = ret;
return ret;
}
int gao(int n) {
int len = 0;
while(n) { a[len++] = n%10; n/=10; }
return dfs(len, 0, 0, 1);
}
int main() {
int i, j, cas, l, r;
cin >> cas;
for(int ca=1; ca <= cas; ca++){
memset(dp, -1, sizeof(dp));
cin >> l >> r >> k;
printf("Case %d: ", ca);
if(k >= 99) puts("0");
else cout << gao(r) - gao(l-1) << endl;
}
return 0;
}