玛里苟斯[清华集训2014 Day1]
瑪里茍斯[清華集訓(xùn)2014 Day1]
魔法之龍瑪里茍斯最近在為加基森拍賣師的削弱而感到傷心,于是他想了一道數(shù)學(xué)題。
S?是一個可重集合,S={a1,a2,…,an}。
等概率隨機取?S?的一個子集?A={ai1,…,aim}。
計算出?A?中所有元素異或?x, 求?xk?的期望。
SOL :
這題目太色情了。沒打高精度炸的不要不要的。
?我們觀察一波局勢,發(fā)現(xiàn)當(dāng)K=1時我們可以按位異或,我們可以證明,若 S集合中存在X 在 i位是1,那么這一位上出現(xiàn)1的期望就是0.5.
? 證明如下,我們把每一位上的ai的值取出來,那么我們發(fā)現(xiàn)0對答案沒有貢獻。設(shè)我們有X個1,而我們?nèi)∨紨?shù)個1的期望為 signma C(2i+1,x)=((1+1)^n+(1-1) ^ n)/2;
而總數(shù)為2^n,那么我們的期望就是0.5.
所以我們統(tǒng)計每一位上是否有1,最后累加除2.
K=2:我們依舊統(tǒng)計每一位上是否有1.
?我們發(fā)現(xiàn)我們得到每一位上有1的位對答案
? ?∑j=0m∑p=0m(∑2ni=1bi,j?bi,p2n?2j+p)
我們就可以將其答案統(tǒng)計出來。
K>2 我們驚奇的發(fā)現(xiàn),對S其進行求線性基其答案不變。我們發(fā)現(xiàn)K>2時由于答案在LongLong范圍內(nèi),我們可以保證求出得基最多22個,
暴力統(tǒng)計答案即可。
#pragma optimize("-O2") #include<bits/stdc++.h> #define sight(c) ('0'<=c&&c<='9') #define LL unsigned long long #define N 100009 #define db long double const LL mo=(1<<25)-1; using namespace std; struct NL{LL a,b;NL() {a=b=0;}NL(LL x,LL y):a(x),b(y){}inline NL operator ^(const NL &A)const &{return NL(A.a^a,A.b^b);}inline NL operator ^(const LL &A)const &{return NL(a,A^b);}inline NL operator +(const NL &A)const &{NL T;T.a=A.a+a; T.b=A.b+b;if (T.b>mo) T.a+=T.b>>25,T.b&=mo;return T;}inline NL operator +(const LL &A)const &{NL T; T.a=a; T.b=A+b;if (T.b>mo) T.a+=T.b>>25,T.b&=mo;return T;}inline NL operator *(const NL &A)const &{NL T;T.a=(A.a*a<<25)+A.a*b+A.b*a; T.b=A.b*b;if (T.b>mo) T.a+=T.b>>25,T.b&=mo;return T;}inline NL operator *(const LL &A)const &{NL T;T.a=a*A; T.b=A*b;if (T.b>mo) T.a+=T.b>>25,T.b&=mo;return T;}inline LL ok(int x){LL T=b&(1ll<<x)-1;b>>=x; b|=(a&(1ll<<x)-1)<<(25-x);a>>=x;return T;} }; inline void read(LL &x){static char c;for (c=getchar();!sight(c);c=getchar());for (x=0;sight(c);c=getchar()) x=x*10+c-48; } void write(LL x) {if (x<10) { putchar('0'+x); return;} write(x/10); putchar('0'+x%10); } inline void writeln(LL x) {if (x<0) putchar('-'),x*=-1; write(x); putchar('\n'); } LL n,k,ans,X,A[N],P[65],r,OT[65],O; NL Ans; void Guass() {for (int i=1;i<=n;i++)for (int j=62;~j;j--)if ((A[i]>>j)&1) if (!P[j]) {P[j]=A[i]; break;} else A[i]^=P[j];for (int j=0;j<=62;j++) if (P[j]) OT[r++]=P[j]; } int b[79]; inline NL pow(NL x,int k){NL anw=NL(0,1);for (;k;k>>=1,x=x*x)if (k&1) anw=anw*x;return anw; } void dfs(NL x,int t){if (!(t^r)) { Ans=Ans+pow(x,k); return;} dfs(x^OT[t],t+1); dfs(x,t+1); } int main () { freopen("malygos.in","r",stdin);freopen("malygos.out","w",stdout);read(n); read(k);for (int i=1;i<=n;i++) {read(A[i]); for (int j=0;j<=63;j++) b[j]|=(A[i]>>j)&1;}if (k==1) {for (int j=63;~j;j--) if (b[j]) ans+=1ll<<j; write(ans>>1); if (ans&1) puts(".5\n"); return 0;}if (k==2) {for (int j=31;~j;j--) if (b[j]) Ans=Ans+(1ull<<2*j+1);for (int i=31;~i;i--) {for (int j=0;j<i;j++) {int c[4]={};for (int k=1;k<=n;k++) c[(A[k]>>i&1)<<1|(A[k]>>j&1)]=1;for (int k=0;k<4;k++) for (int ii=0;ii<4;ii++) for (int jj=0;jj<4;jj++) if (c[ii]&&c[jj]) c[ii^jj] = 1;int s=0;for (int k=0;k<4;k++) s+=c[k];if (c[3]) Ans=Ans+((LL)(8/s)*(1ULL<<i+j));}}LL g=Ans.ok(2);LL T=(Ans.a<<25)+Ans.b;write(T);LL MM=1<<2;if (g) {putchar('.');while (g) {g*=10; putchar('0'+g/MM); g%=MM;}}return 0;}Guass();dfs(NL(0,0),0);LL g=Ans.ok(r);LL T=(Ans.a<<25)+Ans.b;write(T);LL MM=1<<r;if (g) {putchar('.');while (g) {g*=10; putchar('0'+g/MM); g%=MM;}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/rrsb/p/8260454.html
總結(jié)
以上是生活随笔為你收集整理的玛里苟斯[清华集训2014 Day1]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分销系统|分销商城小程序开发方式有什么?
- 下一篇: 标签体系构建原则