http://acm.hdu.edu.cn/showproblem.php?pid=3709
2 0 9 7604 24324
10 897
/** hdu 3709 数位dp(自身平衡的数字) 题目大意:求给定区间内满足自身平衡的数的个数,所谓平衡, 比如:4139 is a balanced number with pivot fixed at 3. The torqueses are 4*2 + 1*1 = 9 and 9*1 = 9, for left part and right part, respectively. 解题思路:枚举支点。dp[i][j][k] i表示处理到的数位,j是支点,k是力矩和。但是要要把全是0的数排除 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; LL dp[20][20][2000]; int bit[25]; LL dfs(int pos,int level,int presum,int flag) { if(pos==-1)return presum==0; if(presum<0)return 0; if(!flag&&dp[pos][level][presum]!=-1) return dp[pos][level][presum]; int end=flag?bit[pos]:9; LL ans=0; for(int i=0; i<=end; i++) { ans+=dfs(pos-1,level,presum+(pos-level)*i,flag&&(i==end)); } if(!flag)dp[pos][level][presum]=ans; return ans; } LL solve(LL n) { int len=0; while(n) { bit[len++]=n%10; n/=10; } LL ans=0; for(int i=0; i<len; i++) { ans+=dfs(len-1,i,0,1); } return ans-(len-1);///去掉全部为0的情况 } int main() { int T; LL l,r; memset(dp,-1,sizeof(dp)); scanf("%d",&T); while(T--) { scanf("%I64d%I64d",&l,&r); printf("%I64d\n",solve(r)-solve(l-1)); } return 0; }