BZOJ3811瑪里苟斯

2022-02-02 07:13:22 字數 1335 閱讀 4451

從乙個序列裡面選擇一些數異或起來,求所有異或方案的答案的 \(k\) 次方的期望值

\(n \le 100000,1\le k \le 5\)

對於 \(k=1\) 的情況,對於每一位分開考慮

如果至少有乙個數的當前位是 \(1\) 的,那麼有一半的可能性為 \(0\)

也就是如果乙個異或方案為 \(0\) 那麼選擇其補就能能得到為 \(1\) 的結果

使用期望的線性性即可

對於 \(k>1\) 的部分,平方的時候二進位制位的貢獻並不獨立,所以需要分開考慮

發現題目中說的 \(ans \le 2^\),那麼對於 \(k \ge 3\) 的,對原序列建立線性基,其大小不會超過 \(63/3=21\)

原序列能異或出來的數,每個會重複 \(2^\) 次,所以期望就是 \(\frac \)

所以這個部分 \(dfs\) 或者直接狀壓即可

剩餘的 \(k=2\) 的部分考慮平方的本質是兩個位相乘進行貢獻,考慮兩個帶 \(1\) 的位置是不是能進行貢獻

如果是乙個數中兩個位置不同,注意這裡要再除掉 \(2\) 因為這裡的異或方案不足

#includeusing namespace std;

#define int long long

namespace yspm

int p[30],s,siz,n,m,pos,las,cnt;

ul ans,a[100010];

inline void insert(int x)

else x^=p[i];

} return ;

} inline void solve()

if(!fg1||!fg2)continue;

if(i+j-fg3-1<0)res++;

else ans+=1ull<<(i+j-fg3-1);}}

ans+=res>>1; res&=1;

printf("%llu",ans);

if(res)printf(".5\n");

else puts("");

return ;

} signed main()

if(m==2) solve();

if(m>=3)

int r1=0,r2=1;

for(int j=1;j<=m;++j)

ans+=r1; las+=r2; ans+=las>>pos; las&=s-1;

} printf("%lld",ans); if(las) puts(".5"); else puts("");

} return 0; }}

signed main()

``

bzoj 3811 瑪里苟斯

time limit 10 sec memory limit 256 mb submit 190 solved 95 submit status discuss 魔法之龍瑪里苟斯最近在為加基森拍賣師的削弱而感到傷心,於是他想了一道數學題。s 是乙個可重集合,s 等概率隨機取 s 的乙個子集 a 計算...

BZOJ 3811 瑪里苟斯(線性基)

description 魔法之龍瑪里苟斯最近在為加基森拍賣師的削弱而感到傷心,於是他想了一道數學題。s 是乙個可重集合,s 等概率隨機取 s 的乙個子集a 計算出 a 中所有元素異或 x,求xk 的期望。input 第一行兩個正整數n,k 以下n 行每行乙個整數,表示ai 1 n 100000,1 ...

bzoj3811 瑪里苟斯 線性基

description 魔法之龍瑪里苟斯最近在為加基森拍賣師的削弱而感到傷心,於是他想了一道數學題。s 是乙個可重集合,s 等概率隨機取 s 的乙個子集 a 計算出 a 中所有元素異或 x,求 x k 的期望。input 第一行兩個正整數 n,k。以下 n 行每行乙個整數,表示 ai。output ...