首页 > 代码库 > HDU 4734 F(x)

HDU 4734 F(x)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734

题意:对于一个n位的十进制数字x=(AnAn-1An-2 ... A2A1),定义 F(x)=An*2n-1+An-1*2n-2+ ...+A2*2+A1*1。给出A、B,求在[0,B]之间有多少数字满足F(x)<=F(A)?

思路:数位DP。f[dep][x]表示到达dep剩余为x的方案数。

 

i64 n,m;i64 f[25][N];int a[25],num;i64 Sum;i64 DFS(int dep,int flag,int cur){    if(cur<0) return 0;    if(dep==-1) return 1;    if(!flag&&f[dep][cur]!=-1) return f[dep][cur];    int M=flag?a[dep]:9;    i64 ans=0,i;    for(i=0;i<=M;i++)    {        ans+=DFS(dep-1,flag&&i==M,cur-i*(1<<dep));    }    if(!flag) f[dep][cur]=ans;    return ans;}i64 cal(){    num=0;    while(n) a[num++]=n%10,n/=10;    Sum=0;    int i,j;    FOR0(i,num) Sum+=a[i]*(1<<i);    num=0;    while(m) a[num++]=m%10,m/=10;    return DFS(num-1,1,Sum);}int main(){    clr(f,-1);    int num=0;    rush()    {        scanf("%I64d%I64d",&n,&m);        printf("Case #%d: %I64d\n",++num,cal());    }}