其实是一道很基础的dp
主 要 是 平 衡 点 的 位 置 不 好 确 定 主要是平衡点的位置不好确定 主要是平衡点的位置不好确定
那 么 不 妨 枚 举 平 衡 点 的 位 置 是 c e n t e r 那么不妨枚举平衡点的位置是center 那么不妨枚举平衡点的位置是center
遍 历 到 c e n t e r 前 面 是 , 加 上 值 遍历到center前面是,加上值 遍历到center前面是,加上值
遍 历 到 c e n t e r 后 面 , 减 去 值 遍历到center后面,减去值 遍历到center后面,减去值
就 很 常 规 了 就很常规了 就很常规了
#include <bits/stdc++.h>
using namespace std;
#define int long long
int dp[20][20][2998],a[23];
int dfs(int len,int center,int sumn,int limit)
{
if( len<1 ) return sumn==0;
if( !limit&&dp[len][center][sumn]!=-1 ) return dp[len][center][sumn];
int ans=0,last=limit?a[len]:9;
for(int i=0;i<=last;i++)
{
int now=sumn;
if( len<center ) now-=(center-len)*i;
if( len>center ) now+=(len-center)*i;
if( now<0 ) continue;
ans+=dfs(len-1,center,now,limit&&(i==a[len]) );
}
if( !limit ) dp[len][center][sumn]=ans;
return ans;
}
int solve(int x)
{
memset(a,0,sizeof(a) );
while( x )
{
a[++a[0] ]=x%10;
x/=10;
}
int ans=0;
for(int i=a[0];i>=1;i--)
ans+=dfs(a[0],i,0,1);
return ans-a[0];
}
signed main()
{
int t;
cin >> t;
memset(dp,-1,sizeof(dp));
while( t-- )
{
int q,w;
cin >> q >> w;
cout << solve(w)-solve(q-1) << endl;
}
}