ACWing 338 計數問題

2021-10-21 01:19:38 字數 2984 閱讀 8917

給定兩個正整數a

aa和b

bb,求[a,

b]

[a,b]

[a,b

]之間所有數字中0∼9

0\sim 9

0∼9出現的次數。前導0

00不許出現。

輸入格式:

輸入包含多組測試資料。每組測試資料佔一行,包含兩個整數a

aa和b

bb。當讀入一行為0 0時,表示輸入終止,且該行不作處理。

輸出格式:

每組資料輸出乙個結果,每個結果佔一行。每個結果包含十個用空格隔開的數字,第乙個數字表示0

00出現的次數,第二個數字表示1

11出現的次數,以此類推。

資料範圍:

1 ≤a

,b

<10

81\le a, b< 10^8

1≤a,

b<10

8有多組測試資料

我們可以開個函式,專門計算[1,

x]

[1,x]

[1,x]中0∼9

0\sim 9

0∼9出現的次數,設這個函式是f(x

)f(x)

f(x)

,那麼[a,

b]

[a,b]

[a,b

]之間所有數字中0∼9

0\sim 9

0∼9出現的次數就是f(b

)−f(

a−1)

f(b)-f(a-1)

f(b)−f

(a−1

)。所以只需要考慮怎麼實現f(x

)f(x)

f(x)

這個函式。首先f(0

)=

0f(0)=0

f(0)=0

。接著考慮x

>0,

f(x)

x>0,f(x)

x>0,

f(x)

。我們列舉0∼9

0\sim 9

0∼9在各個位上出現的時候的計數。比如,我們想列舉k

∈k\in \

k∈在x =a

bcde

fg

‾x=\overline

x=abcd

efg​

這個數字的d

dd這個位置出現的情況下,有多少種可能。分兩種情況討論:

1、如果k

kk的左邊是0∼a

bc‾−

10\sim \overline-1

0∼abc−

1,那麼k

kk右邊可以任意取,0

∼999

0\sim 999

0∼99

9都可以,此時方案數就是1000ab

c‾

1000\overline

1000ab

c;2、如果k

kk的左邊是abc

‾\overline

abc,這個時候要看k

kk和d

dd的關係:

如果k

k<

d,那k

kk右邊可以任意取,有1000

1000

1000

種情況;

如果k =d

k=dk=

d,那k

kk右邊只能取0∼e

fg

‾0\sim \overline

0∼efg​

,有1 +e

fg

‾1+\overline

1+efg​

種情況;

如果k

>

dk>d

k>

d,則沒有可能,0

00種情況;

但是對於k=0

k=0k=

0的情形需要另外考慮,因為不能有前導0

00。首先列舉哪一位可以取k

kk的時候,要略過最高位(它本身就是前導0

00了,要略過),接著,對於情況1

11,k

kk的左邊的範圍變成了1∼a

bc‾−

11\sim \overline-1

1∼abc−

1。注意考慮這個情況就行。**如下:

#include

#include

using

namespace std;

// 求10的x次方

intpow10

(int x)

// 將num表示的正整數

intget

(vector<

int> num,

int l,

int r)

intcount

(int n,

int x)

n = num.

size()

;int res =0;

// 從最高位開始列舉如果x是當前位的話有多少個可能性;如果x = 0的話要略過最高位

for(

int i = n -1-

!x; i >=

0; i--)if

(num[i]

== x) res +

=get

(num, i -1,

0)+1

;else

if(num[i]

> x) res +

=pow10

(i);

}return res;

}int

main()

return0;

}

每次查詢時間複雜度o

(log⁡10

max⁡

)o(\log_\max\)

o(log10​

max)

,空間o

(log⁡10

max⁡

)o(\log_\max\)

o(log10​

max)

AcWing 338 計數問題

acwing 338.計數問題 給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0 9的出現次數。例如,a 1024,b 1032,則 a 和 b 之間共有9個數如下 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現10次,1 出現1...

AcWing 338 計數問題(數字統計dp)

acwing 338.計數問題 給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0 9的出現次數。例如,a 1024,b 1032,則 a 和 b 之間共有9個數如下 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現10次,1 出現1...

計數問題(二)

計數問題 二 在上一講中,我們一起研究 列舉法 乘法原理 加法原理 在計數問題中的應用。但是,在實際的問題中,這些方法並不是單獨使用的。往往需要同時應用這幾種方法,這就需要我們搞清題意,根據已知條件,分別使用正確的方法,得到準確的結果。一 閱讀思考 例1.求720這個數約數的個數。分析與解 從1開始...