hdu3709 数位dp

枚举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;
    }
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10726937.html