暴力解題兩道

2021-09-25 18:28:39 字數 2076 閱讀 3787

求 n!n!

n!的位數。n

nn 不大於 1e7。

解 1:

將 [ 1,

n]

[1, n]

[1,n

] 中的整數逐個相乘。每當中間結果大於10時,不斷地將中間結果除以10並記下除以10的次數。保證中間結果小於10即可。

最蠢最暴力的辦法。考慮到 n 最大為 1e7 ,應該用_int64來儲存中間結果。時間複雜度為o(nlog n),可能會超時。

解2:log⁡10

n\log_n

log10​

n 就是 n 在十進位制表示下的位數。求 log⁡10

(n!)

\log_(n!)

log10​

(n!)

即可。有 log⁡10

(n!)

=∑i=

1n

log⁡10i

\log_(n!)=\sum_^\log_i

log10​

(n!)

=∑i=

1n​log10

​i比較巧妙的暴力方法。有一丶數學技巧。

解3: !n!

n!,然後計算log⁡10

(n!)

\log_(n!)

log10​

(n!)!n!

n!的估計值:

n !≈

2πn(

ne)n

n!≈2πn

​(en

​)n

><><><><><><><><><><><><><><><><><

求區間 [a,

b]

[a,b]

[a,b

] 中的距離最遠的一對素數和最近的一對素數。有多組輸入資料。其中a

aa 大於0,b

bb 小於 231−

12^-1

231−

1,區間長度小於 1e6。

(poj 2689)

找素數,最好的方法是篩法

不大於正實數 x

xx 的素數個數可以由素數定理來估計:

π (x

)≈xln

⁡x

π(x)≈ln

xx​其中,π(x

)\pi \left ( x \right )

π(x)

為不大於正實數 x

xx 的素數個數。

由此可以估計出這個區間中素數個數不多於 1e5 個。可以把這個區間中的所有素數都找出來。

但如果區間的右端點大於 1e7,直接用篩法可能會超時。當右端點很大時,不妨先找出 [1,

231−1

][1,\sqrt-1}]

[1,231

−1​]

中的素數(不多於 6000 個)。 (231

−1,2

31−1]

\left (\sqrt-1},2^-1\right ]

(231−1

​,23

1−1]

中的合數,等價於[1,

231−1

][1,\sqrt-1}]

[1,231

−1​]

中某些素數的整數倍。

程式可以這樣設計:

如果右端點不大於 5e4 ,直接用篩法篩出指定區間的所有素數即可。

如果右端點大於 5e4 ,先用篩法篩出 [1,

5e4]

[1,5e4]

[1,5e4

] 中的所有素數。然後依據這些素數篩出指定區間中的所有素數。

其中,5e4 就是 231−

1\sqrt-1}

231−1​

的估計值。

也可以先找出 [1,

b]

[1,\sqrt]

[1,b​]

中的所有素數,然後再找 [a,

b]

[a,b]

[a,b

] 中的素數。

兩道遞推公式題的解題報告

數學課講題的話到這裡為止吧 這兩題看似相似,其題解分別看來也都很有道理,為什麼其結果卻大相徑庭呢?因為去掉的含非法字串的情況不是f n 2 因為在求f n 時我們已經事先使前n 1項合法,所以在f n 1 我們用來乘以三作為總數的 中a n 1 為o的可能性比t2中a n 1 為w的可能性小。這是因...

兩道baidu試題

1 簡述 n個空間,存放a到a n 1的數,位置隨機且數字不重,a為正且未知,現在第乙個空間的數被誤設定為 1。說明 已經知道被修改的數不是最小的。例子 n 6,a 2,原始的串為5,3,7,6,2,4。現在被別人修改為 1,3,7,6,2,4。現在希望找到5。思路 充分利用等差數列性質。法一 開一...

兩道筆試題

昨天一朋友找工作,碰到兩道演算法筆試題,都是當於鍊錶操作的.原題具體的還原不過來了,不過大致是 1.有一單鏈表,找出最後第m個節點.昨天看到問題時,想到了小學應用題 汽車過山洞,假如這個汽車開著開著,等到車頭剛要出山洞,車尾離山洞出口也有一段距離嘛.這樣,這個題方法出來了 cpp node find...