bzoj 3105 线性基
就正常的nim游戏来说,异或和为0先手必败,所以对于第一次取只要构造出没有异或和为0的子集的线性基就行了。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn = 10005; int n,a[maxn],b[maxn],ins[maxn],cnt; long long res; inline void xor_gauss() { cnt=0; for(int i=n;i>=1;i--) { if(a[i]) res-=b[i]; for(int j=62;~j;j--) if((a[i]>>j)&1){ for(int k=1;k<=n;k++) if(k!=i&&a[k]&&(a[k]>>j)&1) a[k]^=a[i]; break; } } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(int i=1;i<=n;i++)b[i]=a[i],res+=b[i]; xor_gauss(); PRintf("%lld\n",res); return 0; } /* 6 5 5 6 6 5 5 */