hdu3709 枚举

来源:互联网 发布:oracle数据库游标分页 编辑:程序博客网 时间:2024/05/29 07:49
#include<bits/stdc++.h>#define ll long longusing namespace std;ll m,n;ll dp[20][2005][20];int digit[20];ll dfs(int pos,int state,int pivot,bool limit){    if(pos<=0)return state==0;    if(state<0)return 0;    if(!limit&&dp[pos][state][pivot]!=-1)return dp[pos][state][pivot];    ll ans=0;    int up=limit?digit[pos]:9;    for(int i=0;i<=up;i++){        if(pos>pivot)ans+=dfs(pos-1,state+i*(pos-pivot),pivot,limit&&i==digit[pos]);        else ans+=dfs(pos-1,state-i*(pivot-pos),pivot,limit&&i==digit[pos]);    }    if(!limit)dp[pos][state][pivot]=ans;    return ans;}ll solve(ll n){    int pos=0;    while(n){        digit[++pos]=n%10;        n/=10;    }    ll ans=0;    //枚举pivot的位置    for(int i=1;i<=pos;i++){        ans+=dfs(pos,0,i,true);    }    //注意前导0不符合条件   return ans - (pos-1); //减去 00 , 000 , 0000的情况}int main(){    int t;    cin>>t;    while(t--){        memset(dp,-1,sizeof(dp));        cin>>n>>m;        ll ans=solve(m)-solve(n-1);        cout<<ans<<endl;    }    return 0;}

原创粉丝点击