zoukankan      html  css  js  c++  java
  • 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 )

  • 相关阅读:
    Linux下C编程入门(1)
    Git 常用命令速查表
    Git Cheat Sheet 中文版
    Linux 在一个命令行上执行多个命令
    一个奇怪的错误的警示
    模块化编程实例(一)
    含有指针变量的结构体的指针的应用
    iOS 开发加密做法
    关于设置shadowPath的重要性
    关于设置shadowPath的重要性
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350827.html
Copyright © 2011-2022 走看看