BZOJ

UOJ

感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难)

结合两篇写的比较好的详细写一写。如果有错要指出啊QAQ

https://blog.csdn.net/smallsxj/article/details/73205569

https://www.cnblogs.com/wujiechao/p/7781140.html


首先题目要求输出精确的小数,由下面的推导可知答案要么是整数,要么是一位小数\(.5\),不会是\(.25,\ .125\)什么的。

对\(k\)讨论,先以\(k=2\)为例,假设期望异或和是\(S\),把它二进制拆分,每一位记为\(b_i=0/1\),那么答案是\((b_02^0+b_12^1+...+b_m2^m)(b_02^0+b_12^1+...+b_m2^m)=b_0b_02^0+b_0b_12^1+b_0b_22^2+...b_mb_m2^{m+m}\)\(=\sum_i\sum_jb_ib_j2^{i+j}\)。

那么对于\(b_i,b_j\),它的贡献是\(\frac{P}{2^n}\times2^{i+j}\),\(P\)是\(i,j\)两位都为\(1\)的方案数。

那么用\(b_{i,j}\)表示第\(i\)个数二进制拆分后的第\(j\)位,\(x_i\)表示这个数是否存在于选出的集合中,求\(i,j\)位都为\(1\)的方案数,可以列个方程组:

\[\begin{matrix}x_1b_{1,0}\oplus x_2b_{2,0}\oplus...\oplus x_nb_{n,0}=0/1\\x_1b_{1,0}\oplus x_2b_{2,0}\oplus...\oplus x_nb_{n,0}=0/1\\\dots\\x_1b_{1,i}\oplus x_2b_{2,i}\oplus...\oplus x_nb_{n,i}=1\\\dots\\x_1b_{1,j}\oplus x_2b_{2,j}\oplus...\oplus x_nb_{n,j}=1\\\dots\\x_1b_{1,m}\oplus x_2b_{2,m}\oplus...\oplus x_nb_{n,m}=0/1\end{matrix}
\]

(个人感觉这里除去\(i,j\)的方程的右式应该是\(0/1\)吧,那篇博客里写的是\(0\))

解这个方程组,可以发现只会有\(t\leq k\)个\(x_i\)是有唯一解的,其它\(n-t\)个\(x_i\)都有两解。所以方案数为\(2^{n-t}\),贡献就为\(2^{i+j-t}\)。

当\(i\neq j\)时,\(i+j\geq1,\ t\leq2\),所以\(2^{i+j-t}\geq0.5\)。

当\(i=j\)时,\(i+j\geq0,\ t\leq1\),依旧有\(2^{i+j-t}\geq0.5\)。

扩展到\(k\geq2\)的情况,设选出的位有\(k'\)位是互不相同的,设为\(i,j,l...\),那么方程组中右式为\(1\)的等式有\(k'\)个,且\(i+j+l+...\geq0+1+2+...=\frac{k(k-1)}{2}\geq k-1\geq t-1\),所以\(i+j+l+...-t\geq-1\),贡献\(2^{i+j+l+...-t}\geq0.5\)。

\(k=1\)时,显然也成立。

综上,答案要么是整数,要么是一位小数\(.5\)。


其次要注意的是数据范围。答案小于\(2^{63}\),那么似乎就有\(a_i^k\lt2^{63}\),\(a_i\lt\frac{2^{63}}{k}\)。

但是个人认为,比如\(k=1\),\(a_i\lt2^{63}\),但是存在\(2^{63}\leq a_i\lt2^{64}\)也是可以的,因为毕竟是求平均值,多一位还是可能被拉低到下一位去的。所以应该是\(a_i\lt\frac{2^{64}}{k}\)(\(k=1\)需要unsigned long long)。

然而没见到有人这么写的(写范围的都是\(a_i\lt\frac{2^{63}}{k}\))...那我就不知道为啥都开的unsigned long long了。

看了下数据,确实最大值是18446727131960884031\(>2^{63}\)。(答案是\(2^{63}-0.5\) 233好强大)


考虑怎么做。对\(k\)分别求解。

\(k=1\):

对每一位分别考虑。设某一位为\(1\)的数有\(t\)个,为\(0\)的有\(n-t\)个,那么选出奇数个该位为\(1\)的方案数是:\(\sum_{i\ is\ odd}C_n^i2^{n-t}\),偶数个的方案数是\(\sum_{i\ is\ even}C_n^i2^{n-t}\)。

而\(C_n^1+C_n^3+C_n^5+...=2^{n-1}=C_n^0+C_n^2+C_n^4...\)

也就是选出该位为\(1\)的数的个数为奇数和偶数的概率是一样的。那么只要\(t\geq0\),该位为\(1\)为\(0\)的概率是一样的。

所以求一下哪些位上出现过\(1\),加起来除以\(2\)就好了。

\(k=2\):

上面说了答案可以写成\(\sum_i\sum_jb_ib_j2^{i+j}\)。可以直接\(\log^2\)枚举\(i,j\)。

\(b_i\)为\(1\)的概率和\(k=1\)时的情况一样,如果存在一个数第\(i\)位为\(1\),那么就是\(\frac12\),否则是\(0\)。所以如果存在数第\(i\)位不为\(0\)且存在数第\(j\)位不为\(0\),那么贡献就是\(\frac14\times2^{i+j}\)。

需要注意的是如果每个数\(i,j\)位都相同且至少存在一个数满足\(i,j\)位不为\(1\),那么\(i,j\)为\(1\)是同时出现的,概率是\(\frac12\)。

\(k\geq3\):

此时\(a_i\lt2^{22}\),线性基中的元素个数不超过\(22\),所以可以直接\(2^{cnt}\)枚举线性基中元素集合(设线性基元素个数为\(cnt\))。

线性基中每个子集出现的概率都是\(2^n\times2^{n-cnt}=\frac{1}{2^{cnt}}\),求出子集异或和\(x^k\)后除一下即可。

需要注意的是除\(2^{cnt}\)之前\(x^k\)是可以超过\(2^{63}\)的。需要把\(x\)表示成\(\lfloor\frac{x}{2^{cnt}}\rfloor\times2^{cnt}+x\%2^{cnt}\)。

因为有\(\lfloor\frac{x^k}{2^{cnt}}\rfloor\times x+\lfloor\frac{(x^k\%2^{cnt})\times x}{2^{cnt}}\rfloor=\lfloor\frac{x^{k+1}}{2^{cnt}}\rfloor\)。

证明:令\(x^k=a\times2^{cnt}+b\ (b<2^{cnt})\),那么等式左边\(=ax+\lfloor\frac{bx}{2^{cnt}}\rfloor\),等式右边\(=\lfloor\frac{x^k\times x}{2^{cnt}}\rfloor=\lfloor\frac{ax2^{cnt}+bx}{2^{cnt}}\rfloor=ax+\lfloor\frac{bx}{2^{cnt}}\rfloor=左式\)。


//2096kb	728ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
typedef unsigned long long ull;
const int N=1e5+5; ull A[N];
int cnt,base[30],b[30];
char IN[MAXIN],*SS=IN,*TT=IN; inline ull read()
{
ull now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
void Subtask1(int n)
{
ull ans=0;
for(int i=1; i<=n; ++i) ans|=A[i];
printf("%llu",ans>>1);
if(ans&1) printf(".5");
putchar('\n');
}
void Subtask2(int n)
{
ull x=0,y=0;
for(int a=0; a<32; ++a)
{
bool f1=0;
for(int i=1; i<=n; ++i) if(A[i]>>a&1) {f1=1; break;}
if(!f1) continue;
for(int b=0; b<32; ++b)
{
bool f2=0;
for(int i=1; i<=n; ++i) if(A[i]>>b&1) {f2=1; break;}
if(!f2) continue;
bool f3=0;
for(int i=1; i<=n; ++i) if((A[i]>>a&1)^(A[i]>>b&1)) {f3=1; break;}
if(a+b-f3-1>=0) x+=1ull<<a+b-f3-1;
else ++y;//+0.5
}
}
printf("%llu",x+=y>>1);
if(y&1) printf(".5");
putchar('\n');
}
inline void Insert(int x)
{
for(int i=21; ~i; --i)
if(x>>i&1)
if(base[i]) x^=base[i];
else {b[cnt++]=base[i]=x; break;}
}
void Subtask3(int n,int K)
{
for(int i=1; i<=n; ++i) Insert(A[i]);
ull ansx=0,ansy=0;
const int lim=1<<cnt;
for(int s=0; s<lim; ++s)
{
ull val=0,x=0,y=1;
for(int i=0; i<cnt; ++i) s>>i&1&&(val^=b[i]);
for(int i=1; i<=K; ++i)
x*=val, y*=val, x+=y>>cnt, y&=lim-1;
ansx+=x, ansy+=y;
}
ansx+=ansy>>cnt, ansy&=lim-1;
printf("%llu",ansx);
if(ansy) printf(".5");
putchar('\n');
} int main()
{
int n=read(),K=read();
for(int i=1; i<=n; ++i) A[i]=read();
if(K==1) Subtask1(n);
else if(K==2) Subtask2(n);
else Subtask3(n,K); return 0;
}

BZOJ.3811.玛里苟斯(线性基)的更多相关文章

  1. bzoj 3811: 玛里苟斯【线性基+期望dp】

    这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...

  2. bzoj 3811: 玛里苟斯

    3811: 玛里苟斯 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 190  Solved: 95[Submit][Status][Discuss] ...

  3. bzoj 2115 Xor - 线性基 - 贪心

    题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 问点$1$到点$n$的最大异或路径. 因为重复走一条边后,它的贡献会被消去.所以这条路径中有贡献的边可以看成是一条$1$到 ...

  4. UOJ#36. 【清华集训2014】玛里苟斯 线性基

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...

  5. [清华集训2015 Day1]玛里苟斯-[线性基]

    Description Solution 考虑k=1的情况.假设所有数中,第i位为1的数的个数为x,则最后所有的子集异或结果中,第i位为1的个数为$(C_{k}^{1}+C_{k}^{3}+...)$ ...

  6. 【BZOJ 2460】线性基

    2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力 ...

  7. BZOJ 2115 Xor(线性基)

    题意:给定一个n<=50000个点m<=100000条边的无向联通图,每条边上有一个权值wi<=1e18.请你求一条从1到n的路径,使得路径上的边的异或和最大. 任意一条1到n的路径 ...

  8. BZOJ 4184 shallot 线性基+分治

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...

  9. bzoj 2460: 元素 线性基

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2460 题解: RT 线性基裸题 #include <cstdio> #inc ...

随机推荐

  1. ESD选型指南

    信息来自网络,可能有误,希望指正! 一.ESD工作原理 ESD静电保护元件,又称静电抑制二极管.ESD是多个TVS晶粒或二极管采用不同的布局做成具有特定功能的多路或单路ESD保护器件,主要应用于各类通 ...

  2. 打包谷歌浏览器 Chrome 已安装的插件

    环境: OS - win7 64bit 旗舰版 Chrome - 37.0.2062.120 m 以 Smooth Gestures (一款鼠标手势插件)为例,在扩展程序面板 chrome://ext ...

  3. linux 压缩和解压缩

    压缩 tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg tar -czf jpg.tar.gz *.jpg   //将目录里所有jpg文件打包成jpg.ta ...

  4. 远程执行shell脚本

    ssh -p2016 apache@10.10.18.130 '/bin/sh /data/www/vhosts/WOStest3_ENV/update_env.sh' 需要设置shell远程免密码登 ...

  5. AI-CBV写法

    AI-CBV写法 CBV固定样式 #url.py from django.conf.urls import url from django.contrib import admin from app0 ...

  6. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  7. (转载)C#压缩解压zip 文件

    转载之: C#压缩解压zip 文件 - 大气象 - 博客园http://www.cnblogs.com/greatverve/archive/2011/12/27/csharp-zip.html C# ...

  8. php把一些预定义的 HTML 实体转换为字符。

    htmlspecialchars_decode() echo htmlspecialchars_decode($condition,ENT_QUOTES) '  会被转成 单引号

  9. 开源CMS系统Moodle对比中国本土化开源在线教育平台EduSoho

    这段时间研究了一下著名的开源课程管理系统Moodle,也了解了一下目前国内比较火的在线教育平台EduSoho,发现二者有诸多相似之处,但优势各异.接下来就简单对着两个平台做一下对比. 首先来说一下Ed ...

  10. python基础——dict和set(字典和集合)

    1.dict:pop(),get(),in,{} >>> dicttest = {'marry':34,'jucy':56} --初始化>>> dicttest{' ...