数位dp
枚举平衡节点就好
#include <cmath>
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std;
LL l,r,ans;
LL a[30],b[30],la,lb;
LL dp[30][2000];
LL vis[30][2000];
LL poi;
LL dfs (LL u,bool ulim,bool dlim,LL be_val) {
if(u == 0) {
if(!be_val)
return 1;
return 0;
}
LL en = ulim ? b[u] : 9;
LL st = dlim ? a[u] : 0;
if(!(ulim || dlim)) {
if(vis[u][be_val] == poi)
return dp[u][be_val];
else vis[u][be_val] = poi;
}
LL t = 0;
for(LL i = st;i <= en;++i) {
bool ulimt = i == b[u] && ulim;
bool dlimt = i == a[u] && dlim;
if(be_val + (u - poi) * i < 0)
continue;
t += dfs(u - 1,ulimt,dlimt,be_val + (u - poi) * i);
}
if(!(ulim || dlim))
dp[u][be_val] = t;
return t;
}
int main () {
int T;
scanf("%d",&T);
while(T--) {
ans = 0;
memset(vis,-1,sizeof vis);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%I64d%I64d",&l,&r);
if(l)
la = log10(l) + 1;
else la = 1;
if(r)
lb = log10(r) + 1;
else lb = 1;
for(LL i = 1;l;++i) {
a[i] = l % 10;
l /= 10;
}
for(LL i = 1;r;++i) {
if(i > la)
a[i] = 0;
b[i] = r % 10;
r /= 10;
}
for(LL i = 1;i <= lb;++i) {
poi = i;
ans += dfs(lb,1,1,0);
}
if(la == 1 && !a[1]) {
ans -= lb;++ans;
}
printf("%I64d\n",ans);
}
}