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 計算...