1. 程式人生 > >ural 1057 Amount of degrees 數位DP (入門)

ural 1057 Amount of degrees 數位DP (入門)

/**
*    數位dp:
*      第一道數位dp題,還是看《淺談數位類統計問題》看到的題,
*   關於數位dp的理解,理解那棵完全二叉樹就很容易理解了。
*      關鍵是對於非二進位制的計數是如何根據二進位制得出來的dp去計算的,、
*   拿5進位制來說,比如 40132, bit[5] = {4,0,1,3,2} 
*   bit[len-1] = 4, 實現的時候逆序遍歷: i = len-1 -> 0.
*   因為bit[len-1] > 1 也就是說,bit[len-1]位上的數減一之後其後的數都可
*   變成最大的數,在這裡就是4,而bit[len-1] 仍然>= 1
*   所以轉換成二進位制思考的話就是 sum += dp[i+1][k-tot] //tot 是已經選了高位的幾個1,此時還是0.
*   又因為dp[i+1][k-tot]已經涵蓋了所有可能,不用再往前遍歷,直接break就行
*      而如果bit[i]等於1,因為1減去之後為零,即使其後位都變成4.所以還需繼續往前遍歷。
*      bit[i]等於0的時候就繼續遍歷。。
*/


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

#define MAXN 33

using namespace std;

int x, y, k, b;
int dp[MAXN][MAXN];

void dpf()
{
    memset(dp, 0, sizeof(dp));
    dp[0][0] = 1;
    for(int i = 1; i < 32; i ++)
    {
        dp[i][0] = 1;
        for(int j = 1; j <= i; j ++)
            dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
    }
}

int cal(int n, int k, int b)
{
    int digit[MAXN], cnt = 0;
    int tot = 0, ret = 0;
    while(n)
    {
        digit[cnt++] = n % b;
        n /= b;
    }

    for(int i = cnt - 1; i > 0; i --)
    {
        if(digit[i] > 1)
        {
            ret += dp[i+1][k-tot];
            break;
        }
        else if(digit[i] == 1)
        {
            ret += dp[i][k-tot];
            if(++tot > k) break;
        }
    }
    if(tot == k) ret ++;
    return ret;
}

int main()
{
    dpf();
    while(cin >> x >> y >> k >> b)
    {
        cout << cal(y, k, b) - cal(x-1, k, b) << endl;
    }
    return 0;
}

相關推薦

ural 1057 Amount of degrees 數位DP (入門)

/** * 數位dp: * 第一道數位dp題,還是看《淺談數位類統計問題》看到的題, * 關於數位dp的理解,理解那棵完全二叉樹就很容易理解了。 * 關鍵是對於非二進位制的計數是如何根據二進位制得出來的dp去計算的,、 * 拿5進位制來說,

ural 1057 Amount of degrees數位dp

ont ++ algorithm printf pre turn blog _id 數位dp 題意:求(x--y)區間轉化為 c 進制 1 的個數為 k 的數的出現次數。 分析:發現其滿足區間減法,所以能夠求直接求0---x 的轉化為 c 進制中

Ural 1057 Amount of Degrees數位DP

轉成二進位制,組合數搞一下: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algor

URAL 1057. Amount of Degrees數位DP

1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine t

hdu 2089 不要62 數位DP入門

dfs += ret memset tro int 入門 space spa 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 題意: 統計區間 [a,b] 中不含 4 和 62 的數字有多少個。 思路: 學習了數位d

數位dp入門】【HDU2089】62

ret main ont scanf size hdu2089 con %d tmp 為了我的點歪的技能樹…… 所以開始補一些sb的東西…… #include<bits/stdc++.h> typedef long long ll; using namespa

51nod 1009 數位dp入門

ext 一位 group code 1出現的次數 alt 收藏 算法 lis http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 數字1的數量 基準時間限制:1 秒 空間限制:131

hdu3555 Bomb (數位dp入門題)

accep ota line -c them eight otto time test case Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others

數位DP入門

利用 bsp 總結 ret while 說明 sub 體會 但是 數位DP其實是很靈活的,所以一定不要奢求一篇文章就會遍所有數位DP的題,這一篇只能是講清楚一種情況,其他情況遇到再總結,在不斷總結中慢慢體會這個思想,以後說不定就能達到一看到題目就能靈活運用的水平。(其實DP

hdu 2089 不要62 數位dp入門

stream 然而 != 1的個數 tdi 記憶化 代碼 pan += 題意:求一個範圍內的數字,約束條件為不含有數字4以及62 typedef long long ll; int a[20]; ll dp[20][state];//不同題目狀態不同 ll d

HDU-2089不要62-暴力或數位DP入門

之前 scanf href esp ostream += log main string 不要62 題意:給定區間,求在這個區間中有多少個數字,不包含4且不包含62; 這道題作為數位DP的入門題; 暴力也是可以過 #include<cstdio> #inclu

HDU 2089 不要62【數位DP入門題】

pan eps ava con 所有 數據 strong mon sub 不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi

數位dp入門-windy數

算法 並且 我們 等於 smc 發現 滿足 bug 為我 我真是太弱了!!!!!! 顯然的數位dp,一開始我too young too simply的用dp[i][j]表示考慮到了第 i 位,且這一位的數是j的數量。但是,經過SMc的指點後,我發現這個沙雕的方程具有後效性,

數位DP入門專題禮包已經出現~

題目入口:AFei的鍊金術修行之數位DP 題目難度排序:D<F<A<B<E<C<H<G 哇,這套題我做了三次,終於給AK了,陸陸續續差不多做了一個月吧,碰到類似的題已經能夠很快地想到思路了,就很蘇福~~   何謂數位DP 數

COJ1160[一本通 5.3 例 1」Amount of Degrees

  試題描述 求給定區間[X,Y]中滿足下列條件的整數個數:這個數恰好等於K個互不相等的B的整數次冪之和。例如,設X=15,Y=20,K=2,B=2,則有且僅有下列三個數滿足題意:17=2

數位DP入門 HDU 2089 不要62 註釋詳解

題意:輸出一個區間【m,n】內所有不含“62"and"4" 的數字個數;n<=10^7;  數位dp一般應用於:   求出在給定區間[A,B]內,符合條件P(i)的數i的個數.   條件P(i)一般與數的大小無關,而與 數的組成 有關. 具體的理論過程我就不解釋

hdu 3555 Bomb(數位dp入門

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 24148    Accepted Submissi

LOJ10163 Amount of Degrees

題目描述 求給定區間 [X,Y] 中滿足下列條件的整數個數:這個數恰好等於 KK 個互不相等的 BB 的整數次冪之和。例如,設 X=15,Y=20,K=2,B=2,則有且僅有下列三個數滿足題意 輸入格式

數位dp入門(不含49)

給一個數字n,範圍在1~2^63-1,求1~n之間含有49的數字有多少個。 思想:總數-不含49的數; #include<iostream> #include<cstdio> #include<cstdlib> #include&l

數位dp入門(第幾個含有666的數)

求第n個含有666的數。 #include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #