bzoj3811 瑪里苟斯 線性基

2021-08-18 02:41:05 字數 1572 閱讀 7627

description

魔法之龍瑪里苟斯最近在為加基森拍賣師的削弱而感到傷心,於是他想了一道數學題。

s 是乙個可重集合,s=。

等概率隨機取 s 的乙個子集 a=。

計算出 a 中所有元素異或 x, 求 x^k 的期望。

input

第一行兩個正整數 n, k。

以下 n 行每行乙個整數,表示 ai。

output

如果結果是整數,直接輸出。如果結果是小數(顯然這個小數是有限的),輸出精確值(末尾不加多餘的 0)。

sample input

4 2sample output

3.5hint

限制與約定

1≤n≤100000,1≤k≤5,ai≥0。最終答案小於 2^63 。k=1,2,3,4,5 各自占用 20% 的資料

解題思路:

k=1比較簡單,考慮把單獨計算每一位。

如果有至少乙個數這一位是1,那麼很顯然,這一位為0和為1的概率相等,都是0.5;否則這一位只可能是0。

k=2時考慮異或以後做豎式乘法,列舉二進位制任意兩位的平方,當這兩位的平方有貢獻當且僅當這兩位都是1。

然後計算一下這兩位都是1的概率,假設兩位分別為i,j,那麼這兩位組合的期望就是2^∗p。

p也比較好算,如果所有數在i和j兩位都為1的話那麼概率就是0.5,有一位都為0的話就是0,否則概率就是0.25。

k>=3時,因為題目說答案小於2^63,那麼每個數肯定最多只有22位。

根據線性基的性質,n個數異或以後的數出現概率與線性基中這個數出現概率相同。

假設線性基元素有k個,那麼n個數異或以後每個數出現概率就是1/2^k,於是我們直接寫乙個爆搜,搜出線性基的所有異或情況就行了,注意要邊加邊模,不能用double。

#include

#define ll unsigned long long

using

namespace

std;

ll getint()

const

int n=100005;

int n,k;

ll a[n],base[n],ans,ret,sz,tot,cnt;

void solve1()

void solve2()

i+j-1-flag<0?cnt++:res+=(1ll<1-flag);

}res+=cnt/2;printf("%lld",res);

(cnt&1)?puts(".5"):putchar('\n');

}void dfs(int x,int cur)

else

return;

}if(base[x])dfs(x+1,cur),dfs(x+1,cur^base[x]);

else dfs(x+1,cur);

}void solve3()

else x^=base[j];}}

tot=1

<0,0);

printf("%lld",ans);ret?puts(".5"):putchar('\n');

}int main()

BZOJ 3811 瑪里苟斯(線性基)

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

BZOJ3811瑪里苟斯

從乙個序列裡面選擇一些數異或起來,求所有異或方案的答案的 k 次方的期望值 n le 100000,1 le k le 5 對於 k 1 的情況,對於每一位分開考慮 如果至少有乙個數的當前位是 1 的,那麼有一半的可能性為 0 也就是如果乙個異或方案為 0 那麼選擇其補就能能得到為 1 的結果 使用...

bzoj 3811 瑪里苟斯

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