| 记录编号 |
533472 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
3197.石子游戏 |
最终得分 |
100 |
| 用户昵称 |
bilibili |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
2.119 s |
| 提交时间 |
2019-06-26 18:41:27 |
内存使用 |
41.02 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
void FWT(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i){
for(int k=j;k<j+len;k++){
int x=a[k],y=a[k+len];
a[k]=x+y;
a[k+len]=x-y;
}
}
}
}
void IFWT(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i){
for(int k=j;k<j+len;k++){
int x=a[k],y=a[k+len];
a[k]=(x+y)/2;
a[k+len]=(x-y)/2;
}
}
}
}
int n,a[1200100],A[1200100],Xorans=0,B[1200100],C[1200100],maxa,ans;
signed main(){
freopen("nim.in","r",stdin);
freopen("nim.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
Xorans^=a[i];
B[a[i]]=1;
maxa=max(maxa,a[i]+1);
}
int limt=1;
while(limt<=maxa)
limt<<=1;
ans=n;
FWT(B,limt);
A[0]=1;
while(!A[Xorans]){
ans--;
FWT(A,limt);
for(int i=0;i<limt;i++)
C[i]=A[i]*B[i];
IFWT(C,limt);
for(int i=0;i<limt;i++)
A[i]=(C[i]>0);
}
printf("%lld\n",ans);
return 0;
}