ZJOI2010 數字計數

2022-06-04 15:33:09 字數 851 閱讀 9907

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

輸入 

1 99

輸出 9 20 20 20 20 20 20 20 20 20

最近好像喜歡上數字dp了

這是乙個三維的dp

設\(dp[i][j][k]\) 設從後往前填到第\(i\)位 這一位上的數字是\(j\)

\(k\)這個數字出現的次數

void init()

}

我比較習慣在數字dp的時候把dp值求出來 然後根據要求的數字來求解

對於指定的數字求出答案的細節看下面的**

#include#include#include#include#define ll long long

using namespace std;

ll dp[13][10][10],ans[10],tans[10],a[13],an,bn;

void init()

}void solve(ll x)//慣用分解數字

memset(ans,0,sizeof(ans));

for(ll i = 1;i < cnt;i++)

for(ll i = 1;i < a[cnt];i++)//位數同x一樣但是最高位比x最高位小的

for(ll k = 0;k <= 9;k++)

ans[k] += dp[cnt][i][k];

for(ll i = cnt - 1;i >= 1;i--)

return ;

}int main()

ZJOI2010 數字計數

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

ZJOI2010 數字計數

這道題題意清晰明了。最好的方法用字首差求,即 0,b 0,a 1 首先拆位把每位存到陣列中,並求出位數 l 然後把這些數當成 l 位進行統計,不足 l 位的先補字首 0 最後減去多餘的字首 0 即可。下面求 0,a 各個數出現次數的方法大體是 例如 0,1320 1320 中 l 為 4 第一位為 ...

ZJOI2010 數字計數

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