题意 给你一个区间 问你区间内有多少数满足 以一个轴作为中轴 每个位置上的数乘上到中轴的距离左边的等于右边的
我们如何考虑 我们知道 如果一个数都是0 那么在数位dp统计的时候 会被我们认为是满足条件的
第二 我们如何统计呢 我们枚举中轴的位置 让中轴从1到数的位数 这样我们只要求和 (pos-station)*数加起来就是我们的答案
由于从左向右相加 所以当sum<0的时候 我们可以直接return 因为此时越来越小 没有意义
然后我们要排除都是0的影响 只有一个0是可以的 所以我们要减去(位数-1)
代码中的pos由于是pos++ 导致枚举station要i-1即可
代码如下
/*
hdu 3709
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <cstring>
#include <set>
#include <sstream>
#include <map>
using namespace std;
typedef long long ll;
int station;
int a[20];
ll dp[20][1620];
int cal_num(ll x){
int pos = 0;
while(x){
a[pos++] = x%10;
x/=10;
}
return pos;
}
ll dfs(int pos,int sum,bool limit){
if(pos==-1) return sum==0;
if(!limit&&dp[pos][sum]!=-1) return dp[pos][sum];
int up = limit?a[pos]:9;
ll ans = 0;
for(int i = 0;i<=up;++i){
if(sum+(pos-station)*i<0) continue;
ans+=dfs(pos-1,sum+(pos-station)*i,limit&&i==a[pos]);
}
if(!limit) dp[pos][sum] = ans;
return ans;
}
ll solve(ll x){
if(x<0) return 0;
int len = cal_num(x);
ll ans = 0;
for(int i = 1;i<=len;++i){
station = i-1;
memset(dp,-1,sizeof(dp));
ans+=dfs(len-1,0,true);
}
return ans-len+1;
}
int main(){
int t;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
while(t--){
ll le,ri;
scanf("%lld%lld",&le,&ri);
printf("%lld\n",solve(ri)-solve(le-1));
}
return 0;
}