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());

    }

}

 

 

 

你可能感兴趣的:(HDU)