hdu3709 数位dp

时间:2022-02-08 03:32:09

枚举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[][][],a[];
ll dfs(ll pos,ll fix,ll sum,ll lim){
if(pos==)return sum==?:;
if(sum<)return ;
if(!lim && dp[pos][fix][sum]!=-)
return dp[pos][fix][sum];
int num=lim?a[pos]:;
ll res=;
for(int i=;i<=num;i++)
res+=dfs(pos-,fix,sum+i*(pos-fix),lim&&i==num);;
if(!lim)dp[pos][fix][sum]=res;
return res;
}
ll calc(ll x){
if(x==-)return ;
ll len=,res=;
while(x){
a[++len]=x%;
x/=;
}
for(int i=len;i>=;i--)
res+=dfs(len,i,,);
return res-len+;
}
int main(){
memset(dp,-,sizeof dp);
int t;
cin>>t;
while(t--){
ll A,B;
cin>>A>>B;
cout<<calc(B)-calc(A-)<<endl;
}
}