枚举fix所在的位置loc即可,然后数位dp即可
这题要注意一种特殊情况,就是所有位都是0的时候对于每个fix都是成立的
/* dp[i][j][k]表示前i位确定了平衡点在第j位,前i位和为k fix需要在开始dfs前就预先确定下来 */ #include<bits/stdc++.h> using namespace std; #define ll long long ll dp[20][20][1800],a[20]; ll dfs(ll pos,ll fix,ll sum,ll lim){ if(pos==0)return sum==0?1:0; if(sum<0)return 0; if(!lim && dp[pos][fix][sum]!=-1) return dp[pos][fix][sum]; int num=lim?a[pos]:9; ll res=0; for(int i=0;i<=num;i++) res+=dfs(pos-1,fix,sum+i*(pos-fix),lim&&i==num);; if(!lim)dp[pos][fix][sum]=res; return res; } ll calc(ll x){ if(x==-1)return 0; ll len=0,res=0; while(x){ a[++len]=x%10; x/=10; } for(int i=len;i>=1;i--) res+=dfs(len,i,0,1); return res-len+1; } int main(){ memset(dp,-1,sizeof dp); int t; cin>>t; while(t--){ ll A,B; cin>>A>>B; cout<<calc(B)-calc(A-1)<<endl; } }