HDOJ 4734 F(x)


数位DP。。。。

F(x)

Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 750    Accepted Submission(s): 286


Problem Description
For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n * 2 n-1 + A n-1 * 2 n-2 + ... + A 2 * 2 + A 1 * 1. Now you are given two numbers A and B, please calculate how many numbers are there between 0 and B, inclusive, whose weight is no more than F(A).
 

Input
The first line has a number T (T <= 10000) , indicating the number of test cases.
For each test case, there are two numbers A and B (0 <= A,B < 10 9)
 

Output
For every case,you should output "Case #t: " at first, without quotes. The  t is the case number starting from 1. Then output the answer.
 

Sample Input
30 100
1 10
5 100
 

Sample Output
Case #1: 1
Case #2: 2
Case #3: 13
 

Source
2013 ACM/ICPC Asia Regional Chengdu Online
 

Recommend
liuyiding
 
 


#include <iostream>
#include <cstdio>
#include <cstring>

using  namespace std;

typedef  long  long  int LL;

LL dp[ 12][ 111111];
int bit[ 12];

int dfs( int pos, int sum, bool limit)
{
     if(pos==- 1return  1;
     if(~dp[pos][sum]&&limit== falsereturn dp[pos][sum];
     int end=limit?bit[pos]: 9;
     int res= 0;
     for( int i= 0;i<=end;i++)
    {
         if((sum-i*( 1<<pos))>= 0)
            res+=dfs(pos- 1,sum-i*( 1<<pos),limit&&i==end);
    }
     if(!limit)
        dp[pos][sum]=res;
     return res;
}

int getsum( int x)
{
     int l= 1,sum= 0;
     while(x)
    {
        sum+=l*(x% 10);
        x/= 10; l=l* 2;
    }
     return sum;
}

LL colu( int x, int y)
{
     int pos= 0,sum=getsum(y);
     while(x)
    {
        bit[pos++]=x% 10;
        x/= 10;
    }
     return dfs(pos- 1,sum, true);
}

int main()
{
     int cas= 1,x,y,t;
    memset(dp,- 1, sizeof(dp));
    scanf( "%d",&t);
     while(t--)
    {
        scanf( "%d%d",&y,&x);
        printf( "Case #%d: %I64d\n",cas++,colu(x,y));
    }
     return  0;
}
* This source code was highlighted by YcdoiT. ( style: Codeblocks )

你可能感兴趣的:(HDOJ 4734 F(x))