BZOJ 2048 數學(調和級數) 解題報告

2021-08-03 18:50:58 字數 1858 閱讀 4937

2048: [2009國家集訓隊]書堆

第一行正整數 n m

output

一行(有換行符),l,表示水平延伸最遠的整數距離 (不大於答案的最大整數)

sample input

input: 1 100

output: 49

input: 2 100

output: 74

sample output

n <= 10^18

資料保證答案 < 10^6

【解題報告】

初中物理難度,很明顯,

這一層之上所有書的左端點到它的距離和這一層上所有書的右端點到它的距離是相等的。

這樣列方程解出前4層的解.為1/2,1/4,1/6,1/8;顯然規律為1/(2*i)。

答案就是和。

這樣我們可以用到乙個叫做調和級數的東西,

這是euler(尤拉)在2023年,利用newton的成果,首先獲得了調和級數有限多項和的值。結果是:

1+1/2+1/3+1/4+...+1/n= ln(n+1)+r(r為常量)
他的證明是這樣的:

根據newton的冪級數有:

ln(1+

1/x) =

1/x - 1/

2x^2+ 1/

3x^3- ..

於是:

1/x = ln((x+1)/x) + 1/2x^2 - 1/3x^3 + ...
代入x=1,2,…,n,就給出:

給出:

1/1 = ln(2) + 1/2 - 1/3 + 1/4 -1/5 + ...

1/2 = ln(3/2) + 1/2*4 - 1/3*8 + 1/4*16 - ...

......

1/n = ln((n+1)/n) + 1/2n^2 - 1/3n^3 +...

相加,就得到:

得到:

1+1/2+1/3+1/4+...1/n = ln(n+1) + 1/2*(1+1/4+1/9+...+1/n^2) - 1/3*(1+1/8+1/27+...+1/n^3) + ...

後面那一串和都是收斂的,我們可以定義

1+1/2+1/3+1/4+...1/n =ln(n+1) + r
euler近似地計算了r的值,約為約為0.57721566。這個數字就是後來稱作的尤拉常數。

考慮到在n比較小是精度誤差較大,我們可以直接暴力算出、

**如下:

#include

#include

#define r 0.5772156649

#define eps 1e-8

long

long n,m;

double ans=0.0;

int main()

ans*=m;

printf("%d\n",(int)(ans-eps));

return

0; }

BZOJ2326 數學作業

題目傳送門 設n的答案為f n 那麼很容易得到乙個遞推式 f n f n 1 10k n,其中k是n的位數。所以當k固定時,這個式子的轉移方式也是固定的。所以可以列舉每個k。而對於每乙個k,我們很容易得到乙個矩陣 10 k,1,1 0,1,1 0 1,1 對每乙個k,就可以快速計算答案。code i...

BZOJ 3000 Big Number 數學演算法

題目大意 求n 在k進製下的位數 即stirling公式 資料範圍小就暴力,資料範圍大套用stirling公式 注意先利用log來避免數字過大而失精 最後答案要開long long include include include include include using namespace std...

bzoj2326 CodeVS2314 數學作業

題意 求123456789101112 n對m取模的結果。n 10 18,m 10 9。記f i concatenate 1.i 則有f i 1 f i 10 k i 1,其中k為i 1的位數。首先,對於連續的一段遞推式,10 k的值是不變的,因此可以考慮分段進行矩陣乘法快速冪來優化遞推。但是這裡下...