hdoj 3709 Beautiful numbers

来源:互联网 发布:java官网网址 编辑:程序博客网 时间:2024/06/05 04:08

题目链接:Balanced Number

题目大意:给你n和m,问你这个范围里面的平衡数有多少,平衡数是指以某一个数位位对称轴,两边距离乘数位算贡献,如果相等,则位平衡数

题目思路:枚举对称轴,数位dp,算距离不取绝对值,小于零剪枝,需要注意的是0,00,000这样的数都不是平衡数,但是数位dp的时候我们枚举进去了,所以需要减去

#include <map>#include <set>#include <queue>#include <stack>#include <cmath>#include <vector>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;ll digit[20],dp[20][5000][20];ll dfs(ll pos,ll num,ll pivot,bool limit){    if(pos == -1) return num == 0?1:0;    if(num < 0) return 0;    if(!limit&&dp[pos][num][pivot] != -1) return dp[pos][num][pivot];    ll up = limit?digit[pos]:9;    ll ans = 0;    for(ll i = 0;i <= up;i++){        ans += dfs(pos-1,num+i*(pos-pivot),pivot,limit&&i == digit[pos]);    }    if(!limit) dp[pos][num][pivot] = ans;    return ans;}ll solve(ll x){    ll pos = 0;    ll res = 0;    if(x == -1) return 0;    while(x){        digit[pos++] = x%10;        x/=10;    }    for(ll i = 0;i < pos;i++)        res += dfs(pos-1,0,i,true);    return res-pos+1;}int main(){    ll n,m,t;    memset(dp,-1,sizeof(dp));    scanf("%lld",&t);    while(t--){        scanf("%lld%lld",&n,&m);        printf("%lld\n",solve(m)-solve(n-1));    }    return 0;}
原创粉丝点击