生活随笔
收集整理的這篇文章主要介紹了
[UOJ]#36. 【清华集训2014】玛里苟斯 线性基+分类讨论
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
魔法之龍瑪里茍斯最近在為加基森拍賣師的削弱而感到傷心,于是他想了一道數學題。
SSS 是一個可重集合,S=a1,a2,…,anS={a1,a2,…,an}S=a1,a2,…,an。
等概率隨機取 S 的一個子集 A=ai1,…,aimA={ai1,…,aim}A=ai1,…,aim。
計算出 AAA 中所有元素異或 xxx, 求 xkx^kxk 的期望。
題解:
tyb
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL unsigned long long
using namespace std
;
bool c
[65];
LL n
,k
,a
[100010],cnt
=0;
LL b
[65],t
,a1
=0,a2
=0;
void dfs(LL x
,LL v
)
{if(x
>22){if(k
==3) a2
+=v
*v
*v
;if(k
==4){a1
+=(v
*v
/t
)*v
*v
;a1
+=(v
*v
%t
*v
*v
/t
);a2
+=v
*v
%t
*v
%t
*v
%t
;}if(k
==5){a1
+=(v
*v
*v
/t
)*v
*v
;a1
+=(v
*v
*v
%t
*v
*v
/t
);a2
+=v
*v
%t
*v
%t
*v
%t
*v
%t
;}a1
+=a2
/t
;a2
%=t
;return;}dfs(x
+1,v
);if(b
[x
]) dfs(x
+1,v
^b
[x
]);
}
LL ans
=0;
int main()
{scanf("%llu %llu",&n
,&k
);memset(c
,false,sizeof(c
));for(LL i
=1;i
<=n
;i
++) scanf("%llu",&a
[i
]);for(LL i
=1;i
<=n
;i
++)for(LL j
=0;j
<=63;j
++) if(((LL
)1<<j
)&a
[i
]) c
[j
]=true;if(k
==1){for(LL i
=0;i
<=63;i
++) if(c
[i
]) ans
+=(LL
)1<<i
;printf("%llu",ans
/2);if(ans
&1) printf(".5");}else if(k
==2){for(LL i
=0;i
<=63;i
++)if(c
[i
]){for(LL j
=i
+1;j
<=63;j
++)if(c
[j
]){bool flag
=true;for(LL l
=1;l
<=n
;l
++)if(((a
[l
]>>i
)&1)!=((a
[l
]>>j
)&1)) {flag
=false;break;}if(flag
) ans
+=(1LL<<(i
+j
+1));else ans
+=(1LL<<(i
+j
));}}for(LL i
=0;i
<=63;i
++) if(c
[i
]) ans
+=(1LL<<(i
*2));printf("%llu",ans
/2);if(ans
&1) printf(".5");}else{for(LL i
=1;i
<=n
;i
++){LL x
=a
[i
];for(LL j
=63;j
>=0;j
--){if((1LL<<j
)&x
){if(!b
[j
]) {b
[j
]=x
;cnt
++;break;}x
^=b
[j
];}if(j
==0) break;}}t
=1LL<<cnt
;dfs(0,0);printf("%llu",a1
);if(a2
) printf(".5");}
}
總結
以上是生活随笔為你收集整理的[UOJ]#36. 【清华集训2014】玛里苟斯 线性基+分类讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。