这里的题意就算求a到b之间有多少个数满足每个数位上的数的和是10的倍数。
思路就算数位dp;
以下是代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long f[20][20];
int bit[20];
long long dfs(int p,int s,int e) {//其中p代表的是哪一位数,s代表是当前的状态,e表示的是之前的数是不是上界的前缀。
if(p==-1) {
return s==0;
}
if(!e&&~f[p][s]) {
return f[p][s];
}
long long res=0;
int u=e?bit[p]:9;
for(int i=0; i<=u; i++) {
res+=dfs(p-1,(s+i)%10,e&&i==u);
}
return e?res:f[p][s]=res;
}
long long cal(long long x) {
memset(f,0xff,sizeof(f));
int idx=0;
while(x) {
bit[idx++]=x%10;
x/=10;
}
// printf("%d\n",idx);
return dfs(idx-1,0,1);
}
int main() {
int T;
long long a,b;
while(~scanf("%d",&T)) {
for(int i=1; i<=T; i++) {
scanf("%lld%lld",&a,&b);
printf("Case #%d: %lld\n",i,cal(b)-cal(a-1));
}
}
return 0;
}