BZOJ 1833 count 數字計數

2021-08-28 17:52:58 字數 1072 閱讀 4460

題目描述

給定兩個正整數a和b,求在[a,b]中的所有整數中,每個數碼(digit)各出現了多少次。

輸入輸入檔案中僅包含一行兩個整數a、b,含義如上所述。

輸出輸出檔案中包含一行10個整數,分別表示0-9在[a,b]中出現了多少次。

樣例輸入

1 99
樣例輸出

9 20 20 20 20 20 20 20 20 20
提示

30%的資料中,a<=b<=10^6;

100%的資料中,a<=b<=10^12。

思路:數字dp,dp[i][j][k]中i表示第i位,j表示值為j,k表示和。limit用來過濾在0之前未出現0之外的數字的情況。

#include#include#include#includeusing namespace std;

typedef long long ll;

ll dp[20][20][20], a[20], l, r;

ll dfs(int pos, int num, ll sum, bool limit, bool flag)

if (!flag && !limit && dp[pos][num][sum] != -1)

int up = flag ? a[pos] : 9;

ll result = 0;

if (!limit || pos == 0)

else

for (int i = 1; i <= up; i++)

if (!flag && !limit)

return result;

}ll solve(ll x, int num)

if (x == 0)

int pos = 0;

while (x)

return dfs(pos - 1, num, 0, true, true);

}int main()

cout << solve(r, 9) - solve(l - 1, 9);

return 0;

}

BZOJ1833 count 數字計數

題目描述 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出輸出檔案中包含一行10個整數,分別表示0 9在 a,b 中出現了多少次。樣例輸入 1 99樣例輸出 9 20 20 20 20 20 20 2...

BZOJ 1833 count 數字計數 數字DP

description 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。input 輸入檔案中僅包含一行兩個整數a b,含義如上所述。output 輸出檔案中包含一行10個整數,分別表示0 9在 a,b 中出現了多少次。解題報告 這道題很容易看出是乙個數字d...

BZOJ 1833 數字計數 數字DP

題目鏈結 做的第一道數字dp題,聽說是最基礎的模板題,但還是花了好長時間才寫出來。想深入了解下數字dp的請點這裡 先設dp陣列dp i j k 表示數字是i,以j開頭的數k出現的次數 有數字dp的題一般都會用到字首陣列,題目要求我們求b a這個區間裡各個數碼出現的次數,我們可以分別求出 0,b 和 ...