思路:
每次枚举数字和也就是取模的f(x),这样方便计算。
其他就是基本的数位Dp了。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #define ll __int64 9 #define pi acos(-1.0) 10 #define MAX 50000 11 using namespace std; 12 int bit[10],dp[10][90][90][90]; 13 int dfs(int pos,int num,int mod,int sum,bool f) 14 { 15 if(pos==-1) return mod==sum&&num==0; 16 if(!f&&dp[pos][mod][num][sum]!=-1) return dp[pos][mod][num][sum]; 17 int ans=0; 18 int e=f?bit[pos]:9; 19 for(int i=0;i<=e;i++){ 20 ans+=dfs(pos-1,(10*num+i)%mod,mod,sum+i,f&&i==bit[pos]); 21 } 22 if(!f) dp[pos][mod][num][sum]=ans; 23 return ans; 24 } 25 int cal(int n) 26 { 27 int m=0; 28 while(n){ 29 bit[m++]=n%10; 30 n/=10; 31 } 32 int ans=0; 33 for(int i=1;i<=9*m;i++) 34 ans+=dfs(m-1,0,i,0,1); 35 return ans; 36 } 37 int main(){ 38 int t,n,m,ca=0; 39 memset(dp,-1,sizeof(dp)); 40 scanf("%d",&t); 41 while(t--){ 42 scanf("%d%d",&n,&m); 43 printf("Case %d: %d ",++ca,cal(m)-cal(n-1)); 44 } 45 return 0; 46 }