题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4389
题解:数位dp。
此时我们枚举模数,因为范围最大为1e9,故模数最大为81。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int dp[12][100][100][100],n;
int l,r;
int a[12];
int dfs(int pos,int sum,int add,int mod,bool limit)
{
///当各位数之和等于模数mod且该值模与mod==0
if(pos==-1) return sum==mod&&add==0;
if(!limit&&dp[pos][sum][add][mod]!=-1) return dp[pos][sum][add][mod];
int up=limit?a[pos]:9;
int ans=0;
for(int i=0;i<=up;i++)
ans+=dfs(pos-1,sum+i,(add*10+i)%mod,mod,limit&&i==a[pos]);
if(!limit) dp[pos][sum][add][mod]=ans;
return ans;
}
int solve(int x)
{
int pos=0;
while(x){
a[pos++]=x%10;
x/=10;
}
int ans=0;
///我们枚举模数
for(int i=1;i<=81;i++)
ans+=dfs(pos-1,0,0,i,true);
return ans;
}
int main(){
int ncase,T=0;
scanf("%d",&ncase);
memset(dp,-1,sizeof(dp));
memset(a,0,sizeof(a));
while(ncase--)
{
scanf("%d%d",&l,&r);
printf("Case %d: %d\n",++T,solve(r)-solve(l-1));
}
return 0;
}