其实是一道很基础的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;
	}
}