UVa1640 統計問題

2021-08-28 01:13:10 字數 2207 閱讀 3743

給出整數 a 、 b ,統計 a 和 b (包含 a 和 b )之間的整數中,數字 0,1,2,3,4,5,6,7,8,9 分別出現了多少次。 1 ≤ a,b ≤ 108

10^8

108 。注意, a 有可能大於 b 。

樣例:

sample input

1 10

44 497

0 0sample output

1 2 1 1 1 1 1 1 1 1

85 185 185 185 190 96 96 96 95 93

令 fd(

n)

f_d(n)

fd​(n)

表示0~n-1中數字 d 出現的次數,則所求的就是 fd(

b+1)

−fd(

a)

f_d(b+1)-f_d(a)

fd​(b+

1)−f

d​(a

) 。例如,要統計 0~4567 中 4 的個數,可以分成幾個區間。「模板」是指整數的集合。

範圍模板集

備註0~9

**指 0~9 的任意數字

10~99

n*n 值 1~9 的任意數字

100~999

n**1000~3999

1***,2***,3***

4000~4499

40**,41**,…,44**

4500~4559

450*,451*,…,455*

4560~4567

4560,4561,…,4567

對於1**..(假設後面的*有 k 個),統計其 4 的個數,因為總的數字有 10k

10^k

10k 個(從 100…到 199…),一共有 k×1

0k

k\times10^k

k×10

k 個*,如果只考慮*所代表的數字,這些數字裡面 0~9 出現的次數是均等的。所以數字 4 出現的次數為 k×1

0k−1

k\times10^

k×10k−

1 。而n**..裡面數字 n(n!=0)的個數為 9k×

10k−

1+10

k9k\times10^+10^

9k×10k

−1+1

0k。因為 int 型別佔 4 個位元組,所及計數的總數目為 2

32>4∗

10

92^ > 4*10^9

232>4∗

109,因為題目中最大值是 10 的 8 次方,我們可以用 int 存下。

完整程式:

//#define local

#include

#include

#include

#include

#include

//#include

#include

#include

#include

//#include

#include

//#include

using

namespace std;

typedef

long

long ll;

int pow10[10]

;//計算以及儲存 10^i 的值

int cnt[10]

;// 計算以及儲存 i*10^i 的值

intf

(int d,

int n)

}int pre[10]

;// 記錄字串 s[0~i] 有多少 d

for(

int i =

0; i < len; i++

)for

(int i =

0; i < len; i++)if

(j == d)}}

return ans;

}int

main()

int a, b;

while

(cin >> a >> b && a && b)

cout << endl;

}return0;

}

UVA 1640 分塊 數字統計 DFS

紫書中給出的解法是分塊,非常重要的思想,但是網上題解給出的更加簡單dfs 統計每位數對答案的貢獻即可。注意邊界 具體見 include include include include include include include include include include include in...

Uva1640(統計數字出現的次數)

題意 統計兩個整數a,b之間各個數字 0 9 出現的次數,如1024和1032,他們之間的數字有1024 1025 1026 1027 1028 1029 1030 1031 1032 總共有10個0,10個1,3個3等等。解法 這類問題的一般步驟都是先用f n,d 計算出0 n中d數字出現的次數,...

ssl1640 疊放箱子問題

疊放箱子問題 time limit 10000ms memory limit 65536k total submit 317 accepted 119 case time limit 1000ms description 某港口有一批貨櫃,將其編號,分別為1至n。每乙個箱子的外型尺寸都是一樣的,現在...