ZJOI2010 數字計數

2021-09-26 02:15:06 字數 1021 閱讀 8762

題目描述

給定兩個正整數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%的資料中,a<=b<=10^6;

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

....

分析

首先區間[a,b]內的數量可轉化為[1,b]-[1,a-1]。考慮求乙個數碼出現的次數,比如1出現的次數。我們首先想爆搜怎麼寫,然後加乙個記憶化即可。

對於乙個長度為l的數,從高位到低位列舉它每一位上的數字,然後計算1出現的次數。哪些東西要記到狀態裡去?第一,當前的位置l一定要記的。第二,你要記錄當前數字有沒有比num[l]小,是乙個bool值,因為這個用來確定你列舉下一位的範圍。第三,要記錄當前1已經出現的次數。第四,由於前導0不能算,還需記錄之前是否是前導0,也是乙個bool值。..

....

程式:

#include#include#includeusing namespace std;

long long f[20][2][20][2];

int num[20];

long long dfs(int l,bool bz1,int sum,bool bz2,int d)

return f[l][bz1][sum][bz2]=x;

}long long work(long long x,int d)

memset(f,-1,sizeof(f));

return dfs(l,0,0,1,d);

}int main()

ZJOI2010 數字計數

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

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