題目描述
給定兩個正整數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 和 ...