2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接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的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...
随机推荐
- 2-HTML Text Formatting Elements
下表列举了文字格式常见的关键字 Tag Description <b> Defines bold text <em> Defines emphasized text < ...
- HDU 5297
用x ^ (1 / n) 来求个数,容斥原理 , Num会向后移动, 迭代到不再变化,退出循环 #include<iostream> #include<cstdio> #inc ...
- layui框架中关于table方法级渲染和自动化渲染之间的区别简单介绍
方法级渲染: <table class="layui-hide" id="LAY_table_user" lay-filter="user&qu ...
- Idea-Java接入银联支付的Demo
注:本文来源于:< Idea-Java接入银联支付的Demo > 接入银联支付的Demo,希望能给大家节约一点时间 https://github.com/wangfei0904306/un ...
- 复习os模块常用的一些操作
import os # 1.切换路径============= d = os.getcwd() #获取当前的工作路径 os.chdir('D:\\')#目录的切换 print(os.getcwd()) ...
- css样式之属性操作
一.文本属性 1.text-align:cnter 文本居中 2.line heigth 垂直居中 :行高,和高度对应 3.设置图片与文本的距离:vertical-align 4.text-decor ...
- 【python】gevent协程例子
说在前面:用协程还是多线程需要仔细考量.我在做实验时请求了100w个ip,分别用pool为1000的协程和64个线程来跑,结果是多线程的速度是协程的10倍以上. 一个简单的协程例子 #!/usr/bi ...
- 分布式事务XA
1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成 ...
- vue-cli 里axios的使用
1.axios的安装 cnpm i axios --save 2.axios的引入 安装其他插件的时候,可以直接在 main.js 中引入并 Vue.use(),但是 axios 并不能 use,只能 ...
- 论文阅读笔记十八:ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation(CVPR2016)
论文源址:https://arxiv.org/abs/1606.02147 tensorflow github: https://github.com/kwotsin/TensorFlow-ENet ...