ZJOI2010 數字計數

2022-03-25 18:50:55 字數 1220 閱讀 6018

這道題題意清晰明了。

最好的方法用字首差求,即$[0,b]-[0,a-1]$。

首先拆位把每位存到陣列中,並求出位數$l$。

然後把這些數當成$l$位進行統計,不足$l$位的先補字首$0$。

最後減去多餘的字首$0$即可。

下面求$[0,a]$各個數出現次數的方法大體是:

例如$[0,1320]$:

$1320$中$l$為$4$,第一位為$1$,有一位$0$在$1$之前,所以統計$0***$的所有解,而後三位每位一定出現了$1000\times l / 10$次,第一位$0$出現$1000$次。而$1$只出現了$320$次。

取出後三位$320$,現在只需統計$[0,320]$中各位出現次數。

有三位$0$、$1$、$2$出現在$3$之前,所以統計$0**$、$1**$、$2**$的所有解,後兩位每位出現了$100\times l / 10$,第一位$0$、$1$、$2$分別出現了$100$次,而$3$只出現了$20$次。

取出後兩位$20$,便只要統計$[0,20]$中各位出現次數了。

後面略。

下面的寫法就是將上面的理解抽象。

1 #include 2

3using

namespace

std;45

#define re register

6#define rep(i, a, b) for (re int i = a; i <= b; ++i)

7#define repd(i, a, b) for (re int i = a; i >= b; --i)

8#define maxx(a, b) a = max(a, b);

9#define minn(a, b) a = min(a, b);

10#define ll long long

11#define inf (1 << 30)

1213

inline ll read()

1920

const

int maxl = 16;21

22ll f1[maxl], f2[maxl], a, b, p[maxl];

23int

l, bit[maxl];

2425

void

make(ll x)

2930

void solve(ll *f, ll v) 38}

3940

intmain()

ZJOI2010 數字計數

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

ZJOI2010 數字計數

給定兩個正整數 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 這個數...

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...