題目大意:給n個數字,求子集的異或和的k次方的期望(n<=10^5,k<=5,保證答案小於2^63)
做法:首先如果從集合中拿出a和b,把a和a xor b放回集合,子集的異或和與原來是一一對應的,用高斯消元的思想可以消到只剩log個數,其他都是0,對答案沒有影響。然後考慮k次方的期望,我們把二進位制下每一位拆開,假設第i位的數字為xi,答案為(x1+x2+...+xlog)^k的期望,展開式子後發現是選k次x1~xlog中的數(可以重複選),每種選法選的位的乘積的期望的和,暴力列舉每種選法,複雜度為log^k(顯然在k比較大時,由於答案範圍限制,log不會太大,所以複雜度可以接受),一種選法只有選出的位都為1才對答案有貢獻,列出方程然後高斯消元計算合法方案,每種方案的貢獻必然是2的次冪並且冪數最小為-1,運算時直接記是多少次冪,算完再乘個2加入答案,最後判是否是奇數輸出.5即可。
**:
#include#include#define ll unsigned long longll read()
ll z[
64],ans;
int mx,k,a[5],t[5
];void dfs(int
x)
for(x=(1
<1,i=k;i--;s+=a[i])if(x&(1
if(!x)ans+=1ull
; }
for(int i=0;i<=mx;++i)a[x]=i,dfs(x+1);}
intmain()
for(mx=64;mx--;)if(z[mx])break
; dfs(0);
printf(
"%lld%s
",ans>>1,ans&1?"
.5":""
);}
UOJ37 清華集訓2014 主旋律
link 然後列舉縮點之後的dag的情況,考慮計算可行的邊集方案數,再遞迴乘上所有scc的匯出子圖的答案。計算可行的邊集方案數可以考慮dp,設 f s 表示點集 s 的匯出子圖中使得子圖形成乙個dag的邊集方案數,那麼可以得到轉移 f s sum limits 1 f 2 其中 cnt 表示的是起點...
UOJ 42 清華集訓2014 Sum
首先把底數 1 消掉 1 n 1 2 times n 2 1 2 times n lfloor frac n 2 rfloor times 2 令 k sqrt r 所以原式等於 begin sum limits n 1 sum limits n 1 2 times lfloor ik rfloor...
UOJ37 清華集訓2014 主旋律
設 f s 為點集 s 中強連通生成子圖的方案數,cnt s 為點集 s 構成的誘導子圖中邊的個數。考慮用 2 減去不合法方案數來計算 f s 不合法情況即為縮點後為 dag 設 h s 為點集 s 縮點後構成點數 1 的 dag 的方案數。考慮列舉乙個點集 t 其由若干個出度為 0 的強連通分量構...