题意:求[l,r]之间能被k整除 且各位数字之和也能被k整除 的数的个数
思路:因为2^31 为十位数 最大的十位数 各个数位之和为90 所以当k>90时 各个数位之和必不能被k整除 所以k>90可以直接输出0
k<90时正常的数位dp就可以了
#include<stdio.h>
#include<string.h>
int dp[10][90][90];
int digit[10];
int k;
int dfs(int pos,int mod,int s,int doing)
{
if(pos==-1)return mod==0&& s%k==0;
if(!doing && dp[pos][mod][s]!=-1)return dp[pos][mod][s];
int ans=0,End,i;
End=doing?digit[pos]:9;
for(i=0;i<=End;i++)
{
ans+=dfs(pos-1,(mod*10+i)%k,s+i,doing &&i==End);
}
if(!doing)
dp[pos][mod][s]=ans;
return ans;
}
int solve(int x)
{
int l=0;
memset(digit,0,sizeof(digit));
memset(dp,-1,sizeof(dp));
while(x>0)
{
digit[l++]=x%10;
x=x/10;
}
return dfs(l-1,0,0,1);
}
int main()
{
int t,v=1;
int a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&a,&b,&k);
if(k>90)
{
printf("Case %d: 0\n",v++);
continue;
}
printf("Case %d: %d\n",v++,solve(b)-solve(a-1));
}
return 0;
}