题目链接:Balanced Number
题目大意:给你n和m,问你这个范围里面的平衡数有多少,平衡数是指以某一个数位位对称轴,两边距离乘数位算贡献,如果相等,则位平衡数
题目思路:枚举对称轴,数位dp,算距离不取绝对值,小于零剪枝,需要注意的是0,00,000这样的数都不是平衡数,但是数位dp的时候我们枚举进去了,所以需要减去
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll digit[20],dp[20][5000][20];
ll dfs(ll pos,ll num,ll pivot,bool limit){
if(pos == -1) return num == 0?1:0;
if(num < 0) return 0;
if(!limit&&dp[pos][num][pivot] != -1) return dp[pos][num][pivot];
ll up = limit?digit[pos]:9;
ll ans = 0;
for(ll i = 0;i <= up;i++){
ans += dfs(pos-1,num+i*(pos-pivot),pivot,limit&&i == digit[pos]);
}
if(!limit) dp[pos][num][pivot] = ans;
return ans;
}
ll solve(ll x){
ll pos = 0;
ll res = 0;
if(x == -1) return 0;
while(x){
digit[pos++] = x%10;
x/=10;
}
for(ll i = 0;i < pos;i++)
res += dfs(pos-1,0,i,true);
return res-pos+1;
}
int main(){
ll n,m,t;
memset(dp,-1,sizeof(dp));
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&m);
printf("%lld\n",solve(m)-solve(n-1));
}
return 0;
}