解题思路:标准的数位Dp模板,dp[i][j][sum]表示最长为i,转轴为j,sum总力矩(左边力矩-右边力矩)
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll dp[20][20][1800];
int d[25];
ll dfs(int pos,int mid,int sum,bool lim)
{
if(!pos) return !sum;
if(sum<0) return 0;
ll ans=0,&r=dp[pos][mid][sum];
if(!lim&& r!=-1) return r;
int up= !lim? 9:d[pos];
for(int i=0;i<=up;i++)
{
ans+=dfs(pos-1,mid,sum+i*(pos-mid),lim&&i==d[pos]);
}
if(!lim) r=ans;
return ans;
}
ll solve(ll a)
{
if(a<0) return 0;
ll ans=0;
int l=0;
while(a>0)
{
d[++l]=a%10;
a/=10;
}
for(int i=1;i<=l;i++)
{
ans+=dfs(l,i,0,1);
}
return ans-l+1; //"-l+1"是因为上面不同转轴时都有一种重复的情况即0000000000
}
int main()
{
//freopen("t.txt","r",stdin);
int T;
ll a,b;
scanf("%d",&T);
memset(dp,-1,sizeof(dp));
while(T--)
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",solve(b)-solve(a-1));
}
return 0;
}