【HDU3709】 Balanced Number

来源:互联网 发布:做知敬畏守底线的教师 编辑:程序博客网 时间:2024/06/07 05:30

Problem

http://acm.hdu.edu.cn/showproblem.php?pid=3709

Solution

一开始想到的是f[len][pivot][j][k]记录到len,支点为pivot,左边j,右边k的值
看过题解后发现可以直接记录j-k为power_matrix,这样可以少一维,还可以在为负数时剪枝。

CODE

/* * @key word:digit * @tesed on:HDU3709 15ms * @Author: lhq  * @Date: 2017-08-16 19:31:38  * @Last Modified by: lhq * @Last Modified time: 2017-08-16 19:33:09 */#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define ll long longll dp[20][20][1500];int a[20];ll dfs(int len,int pos,int sum,bool limit){    if (len==0) return sum==0?1:0;    if (sum<0) return 0;    if (!limit && dp[len][pos][sum]!=-1) return dp[len][pos][sum];    int up=limit?a[len]:9;    ll ans=0;    for (int i=0;i<=up;i++)        ans+=dfs(len-1,pos,sum+i*(len-pos),limit && i==up);    if (!limit) dp[len][pos][sum]=ans;    return ans;}ll solve(ll x){    if (x<0) return 0;    int len=0;    while (x)    {        a[++len]=x%10;        x/=10;    }    ll ans=0;    for (int i=1;i<=len;i++)        ans+=dfs(len,i,0,true);    return ans-len+1;}int main(){    int T;    cin>>T;    memset(dp,-1,sizeof(dp));    while (T--)    {        ll x,y;        cin>>x>>y;        cout<<solve(y)-solve(x-1)<<endl;    }    return 0;}
原创粉丝点击