1. 程式人生 > >[方差+lucas定理] 51nod 演算法馬拉松25 D. 小Q的集合

[方差+lucas定理] 51nod 演算法馬拉松25 D. 小Q的集合

題意

小Q有一個集合 S ,它的元素個數 |S|=n 。
對於 S 的任意一個子集合 T ,定義 f(T)=|T|k ,定義 T 關於 S 的補集為 S−T 。
小Q想知道,如果他等概率地選擇一個 S 的子集 T ,那麼 f(T)−f(S−T) 的方差是多少。
由於這個方差值可能很大,不妨設其為 v ,你只需要給出 (v2n)%m 的值即可。
k ≤ n ≤ 10^(10^6) , 1 ≤ k ≤ 10^6,其中m是質數,滿足2 ≤ m ≤ 10^6。

題解

方差的定義:E[(xE(x))2] ,根據期望線性性質可化簡為E(x2)E(x)2
注意到E(x)恆為0,所以我們只需要計算(

E(x2)2n)%m 即可。
E(x2)2n=ni=0(ni)(ik(ni)k)2
注意到n很大,肯定不能直接求。
注意到右邊的(ik(ni)k)2 模m是迴圈的。但是前面還有一個組合數。
這裡要用到lucas定理:(nm)=(n%Pm%P)(n/Pm/P)(modP)
這個定理比較適合模數小的問題。
對於i mod m相同的每一組,(n%Pi%P)都是相同的。
按這個思路,可得
E(x2)2n
=n/mi=0n%mj=0(nim+j)((im+j)k(n(im+j))k)2
=n/mi=0n%mj=0(n/mi)(n%mj)((
im+j)k(n(im+j))k)2

=n/mi=0(n/mi)n%mj=0(n%mj)(jk(nj)k)2
內層那個sigma就和i無關了,每次都是一樣的,所以
=2n/mn%mj=0(n%mj)(jk(nj)k)2
直接求即可。

這題怎麼卡常啊,半天才過……

<