Investigation
Description
An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is divisible by 3 and 12 (3+7+0+2) is also divisible by 3. This property also holds for the integer 9.
In this problem, we will investigate this property for other integers.
Input
Input starts with an integer T (≤ 200), denoting the number of test cases.
Each case contains three positive integers A, B and K (1 ≤ A ≤ B < 231 and 0 < K < 10000).
Output
For each case, output the case number and the number of integers in the range [A, B] which are divisible by K and the sum of its digits is also divisible by K.
Sample Input
3
1 20 1
1 20 2
1 1000 4
Sample Output
Case 1: 20
Case 2: 5
Case 3: 64
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long dp[35][100+5][100+5];
long long bit[35],k;
long long dfs(long long pos,long long pre,long long mod,long long limit)
{
if(pos==0)return pre==0&&mod==0;
if(!limit&&dp[pos][pre][mod]!=-1)return dp[pos][pre][mod];
long long ans=0;
long long num=limit?bit[pos]:9;
for(long long i=0;i<=num;i++)
{
long long nowx=(pre+i)%k;
long long nowy=(mod*10+i)%k;
ans+=dfs(pos-1,nowx,nowy,limit&&i==num);
}
if(!limit)dp[pos][pre][mod]=ans;
return ans;
}
long long solve(long long n)
{
memset(bit,0,sizeof(bit));
long long len=0;
while(n){
bit[++len]=n%10;
n/=10;
}
return dfs(len,0,0,1);
}
int main()
{
long long t,ca=0;
scanf("%lld",&t);
while(t--){
memset(dp,-1,sizeof(dp));
long long a,b;
scanf("%lld%lld%lld",&a,&b,&k);
ca++;
printf("Case %lld: ",ca);
if(k>=100){
printf("0\n");
continue;
}
printf("%lld\n",solve(b)-solve(a-1));
}
return 0;
}