求 n!n!解 1:n!的位數。n
nn 不大於 1e7。
將 [ 1,
n]
[1, n]
[1,n
] 中的整數逐個相乘。每當中間結果大於10時,不斷地將中間結果除以10並記下除以10的次數。保證中間結果小於10即可。
最蠢最暴力的辦法。考慮到 n 最大為 1e7 ,應該用_int64
來儲存中間結果。時間複雜度為o(nlog n)
,可能會超時。
解2:log10
n\log_n
log10
n 就是 n 在十進位制表示下的位數。求 log10
(n!)
\log_(n!)
log10
(n!)
即可。有 log10
(n!)
=∑i=
1n
log10i
\log_(n!)=\sum_^\log_i
log10
(n!)
=∑i=
1nlog10
i比較巧妙的暴力方法。有一丶數學技巧。
解3: !n!
n!,然後計算log10
(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...