对于4139,支点为3,(4-2)*4+(3-2)*1+(2-2)*3+(1-2)*9=0
dp[dep][sum][zzz]表示长度为dep,之前的权值为sum,支点为zzz的平衡数的个数
枚举支点求值
注意0的情况
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll dp[20][2000][20]; 5 int dig[20]; 6 ll dfs(int dep,int sum,int zzz,int flag){ 7 if(!dep)return !sum; 8 if(sum<0)return 0; 9 if(!flag&&dp[dep][sum][zzz]!=-1)return dp[dep][sum][zzz]; 10 int lim=flag?dig[dep]:9; 11 ll ans=0; 12 for(int i=0;i<=lim;i++) 13 ans+=dfs(dep-1,sum+(dep-zzz)*i,zzz,flag&(i==lim)); 14 if(!flag)dp[dep][sum][zzz]=ans; 15 return ans; 16 } 17 ll solve(ll x){ 18 int dd=0; 19 while(x)dig[++dd]=x%10,x/=10; 20 ll ans=0; 21 for(int i=dd;i;i--)ans+=dfs(dd,0,i,1); 22 return ans-dd+1;//0满足所有,但只算一次 23 } 24 int main(){ 25 memset(dp,-1,sizeof(dp)); 26 int T; 27 scanf("%d",&T); 28 while(T--){ 29 ll A,B; 30 scanf("%lld%lld",&A,&B); 31 printf("%lld ",solve(B)-solve(A-1)); 32 } 33 return 0; 34 }