原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html

题目传送门 - https://www.nowcoder.com/acm/contest/146/H

题意

  有 $n$ 堆石子,第 $i$ 堆有 $a_i$ 个。请你取出尽量多堆石子,使得取石子nim游戏后手必胜。输出你选择的石子堆数。

  $n,a_i\leq 5\times 10^5$

题解

  首先我们把题转化成:在 $n$ 个数中选择尽量多的数,使得他们的异或值为 $0$ 。

  然后我们把题转化成:在 $n$ 个数中选择尽量少的数,使得他们的异或值为一个特定值 $C$ 。其中 $C=a_1\ {\rm XOR} \cdots {\rm XOR}\ a_n$ 。显然,答案为 $n-$ 你选择的数的个数。

  考虑将 $a_i$ 二进制的每一维拆开,看作一个 $d$ 维向量。其中由于 $a_i\leq 2^{19}$,所以我们取 $d=19$ 。

  由于 $d$ 维线性无关向量组最多有 $n$ 个向量,所以我们最多在那些数字里面取 $d$ 个。

  我们考虑二分答案,假设选择小于等于 $k$ 个就可以组成 $C$ 了。

  我们如何验证:

  对于原数组每一个数出现的位置都记一下,然后把位置 $0$ 也搞一下,然后取它在异或卷积意义下的 $k$ 次幂,判断一下可不可以合成 $C$ 即可。这个用 FWT 做。

代码

#include <bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x;
}
const int N=1<<19,mod=1e9+7,inv2=5e8+4;
int n,a[N],b[N],v=0;
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
void FWT(int a[],int n,int flag){
for (int d=1;d<n;d<<=1)
for (int i=0;i<n;i+=(d<<1))
for (int j=0;j<d;j++){
int x=a[i+j],y=a[i+j+d];
a[i+j]=(x+y)%mod;
a[i+j+d]=(x-y)%mod;
if (flag==-1){
a[i+j]=1LL*a[i+j]*inv2%mod;
a[i+j+d]=1LL*a[i+j+d]*inv2%mod;
}
}
}
bool check(int x,int n){
for (int i=0;i<n;i++)
b[i]=Pow(a[i],x);
FWT(b,n,-1);
b[v]=(b[v]+mod)%mod;
return b[v]>0;
}
int main(){
n=read();
memset(a,0,sizeof a);
for (int i=1;i<=n;i++){
int x=read();
v^=x;
a[x]++;
}
a[0]++;
int m=1<<19;
FWT(a,m,1);
int L=0,R=19,mid,ans=19;
while (L<=R){
mid=(L+R)>>1;
if (check(mid,m))
R=mid-1,ans=mid;
else
L=mid+1;
}
printf("%d\n",n-ans);
return 0;
}

  

2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  4. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  8. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

  9. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...

随机推荐

  1. Windows中查看端口占用及关闭对应进程

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID,之后在任务管理器(右键电脑屏幕的状态栏即可找到)中找到这个PID所对应的程序.如果任务管理器中没有PID ...

  2. spring mvc数据绑定与表单标签库

    Book类为 package org.shaoxiu; public class Book { private String id; private String name; public Book( ...

  3. [MySQL]子语句的查询技巧

    一.统计group by语句的行数 group by语句中,如果包含字段统计函数(诸如:count(),sum()...),这种情况下统计函数只会作用于group by的字段,因此想拿到最终结果的行数 ...

  4. 4)django-视图view

    视图是django功能函数,结合url使用 1.视图方式 视图方式经常用的有两种 用户GET获取数据      用户POST提交数据            用户第一次访问页面是GET       用户 ...

  5. JsRender 前端渲染模板基础学习

    JsRender前端渲染模板 使用模板,可以预先自定义一些固定格式的HTML标签,在需要显示数据时,再传入真实数据组装并展示在Web页中:避免了在JS中通过“+”等手动分割.连接字符串的复杂过程:针对 ...

  6. 移动端适配——font-size计算

    function calcFontSize(){ var view_width = window.screen.width; var view_height = window.screen.heigh ...

  7. 年底Android面试整理(附答案)

    面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二.以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期, ...

  8. Confluence 6 配置白名单

    Confluence 管理员可以通过添加 URLs 到白名单选择出入的链接和使用 RSS 宏,HTML 包含宏和小工具中的内容. 如果一个内容被添加到 Confluence 系统中,但是这个 URLs ...

  9. HTML 转义字符对应表

    <%@ tag language="java" pageEncoding="UTF-8" %> <%@ attribute name=&quo ...

  10. anaconda中的包如何传到pycharm中使用?

    在pycharm的setting中设置 在project interpreter 中的 existing environment 中选择 anaconda3安装目录下的的 python.exe 就可以 ...