這道題題意清晰明了。
最好的方法用字首差求,即$[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 23using
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...