• 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 (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 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 < 109)
     

    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
     

    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 ",cas++,colu(x,y));
        }
        return 0;
    }
    * This source code was highlighted by YcdoiT. ( style: Codeblocks )

  • 相关阅读:
    c#中使用SESSION需要注意的几个问题
    C#常见算法题目(面试准备)
    C# WinForm捕获未处理的异常
    c#生成注册码的两种方法(mac地址与IP地址)
    MVC3 IIS7部署记录
    c#4.0新特性之协变与逆变
    C#语言的几个层次
    C#的装箱和拆箱
    Windows下的Memcache安装
    在C#中读取枚举值的描述属性
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350827.html
Copyright © 2020-2023  润新知