bzoj 3811: 玛里苟斯(期望+线性基)
3811: 瑪里茍斯
Time Limit:?10 Sec??Memory Limit:?256 MBSubmit:?223??Solved:?98
[Submit][Status][Discuss]
Description
魔法之龍瑪里茍斯最近在為加基森拍賣師的削弱而感到傷心,于是他想了一道數(shù)學(xué)題。 S 是一個可重集合,S={a1,a2,…,an}。 等概率隨機(jī)取 S 的一個子集 A={ai1,…,aim}。 計(jì)算出 A 中所有元素異或 x, 求 xk 的期望。Input
第一行兩個正整數(shù) n, k。 以下 n 行每行一個整數(shù),表示 ai。Output
如果結(jié)果是整數(shù),直接輸出。如果結(jié)果是小數(shù)(顯然這個小數(shù)是有限的),輸出精確值(末尾不加多余的 0)。Sample Input
4 2 0 1 2 3Sample Output
3.5
比較難的題
求出n個數(shù)的線性基,線性基中每個集合的異或和都唯一,并且屬于滿射
所以可以暴力線性基的所有集合異或和,然后加在一起除以2^cnt就是答案了(cnt為線性基元素個數(shù))
但是線性基中最多有62個數(shù),暴力是不行的
考慮按k分情況討論
①k>=3:
因?yàn)榇鸢覆粫^long long范圍,所以線性基中所有元素不會超過64/3個,可以直接暴力
不過注意一個坑:答案不會超過long long但是你計(jì)算所有異或和最后要除以2^cnt才是答案,所以計(jì)算所有貢獻(xiàn)的過程中可能會爆long long,要邊計(jì)算邊除,也就是將val寫成val/(2^cnt)和val%(2^cnt)兩部分;
②k = 1:
不能暴力了,假設(shè)某個數(shù)ai轉(zhuǎn)成二進(jìn)制后第k位為1,因?yàn)檫@個數(shù)被選的概率剛好是1/2,并且很明顯,無論它和誰異或,這個1一定都會有剛好1/2的概率對答案有貢獻(xiàn),所以可以發(fā)現(xiàn)答案就是所有數(shù)or起來/2
③k = 2:
假設(shè)某個集合的異或和為x,x轉(zhuǎn)成二進(jìn)制后是bm…b1b2b3(bm表示二進(jìn)制第m位,0/1),那么x2就等于∑bibj*2^(i+j),當(dāng)且僅當(dāng)?shù)趇位第j位都為1時,對答案計(jì)算有2^(i+j)的貢獻(xiàn),用上面k=1的思想可以輕松得出這個概率是1/4(有00, 10, 01, 11四種情況各1/4),不過,當(dāng)所有數(shù)第i位和第j位都相同時,概率會變?yōu)?/2(只有00,11兩種情況),當(dāng)所有數(shù)第i位都為0或者第j位都為0時概率為0
#include<stdio.h> #define LL unsigned long long LL a[100005], p[66], jz[66], er[66] = {1}; int main(void) {LL ans, temp, mod, c, d;int i, j, k, cnt, n, flag;scanf("%d%d", &n, &k);for(i=1;i<=62;i++)er[i] = er[i-1]*2;for(i=1;i<=n;i++)scanf("%llu", &a[i]);if(k==1){ans = 0;for(i=1;i<=n;i++)ans |= a[i];printf("%llu", ans/2);if(ans%2)printf(".5");}else if(k==2){temp = 0;for(i=1;i<=n;i++)temp |= a[i];mod = ans = 0;for(i=62;i>=0;i--){for(j=62;j>=0;j--){if((temp&(1ll<<i))==0 || (temp&(1ll<<j))==0)continue;flag = 1;for(k=1;k<=n;k++){if((a[k]&(1ll<<i)) && (a[k]&(1ll<<j))==0 || (a[k]&(1ll<<i))==0 && (a[k]&(1ll<<j))){flag = 0;break;}}if(flag){ans += er[i+j]/2;mod += er[i+j]%2;}else{ans += er[i+j]/4;if(er[i+j]%4)mod++;}}}printf("%llu", ans+mod/2);if(mod%2)printf(".5");}else{cnt = 0;for(i=1;i<=n;i++){for(j=62;j>=0;j--){if(a[i]&(1ll<<j)){if(p[j]==0){p[j] = a[i];jz[cnt++] = p[j];break;}elsea[i] ^= p[j];}}}ans = mod = 0;for(i=0;i<(1ll<<cnt);i++){temp = 0;for(j=0;j<=cnt-1;j++){if(i&(1ll<<j))temp ^= jz[j];}c = 0, d = 1;for(j=1;j<=k;j++){c *= temp, d *= temp;c += d/er[cnt], d %= er[cnt];}ans += c, mod += d;ans += mod/er[cnt], mod %= er[cnt];}printf("%llu", ans);if(mod)printf(".5");}printf("\n");return 0; }
總結(jié)
以上是生活随笔為你收集整理的bzoj 3811: 玛里苟斯(期望+线性基)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux原理与应用 武汉大学,Linu
- 下一篇: 计算机显卡显示图片原理,认识显卡!浅析显