筱玛爱游戏
题解:
这题需要一些线性代数的知识
每个数可以看做一个 向量(即每一维都是 0 或 1 的向量)
这时数的异或就相当于向量的加法
那么集合存在一个非空子集异或和为0即为这个向量组线性相关
那么两个人在博弈过程中每一步都需保证向量组线性无关
那么这个向量组最大的大小即为所有向量的秩
而由线性代数基本结论,若当前选出的向量线性空间维数小于所有向量的秩,一定能加入一个另外的向量,使得向量组仍线性无关
因此两个人的移动次数是确定的(即为原向量组的秩),只需判断奇偶性即可
求秩可以使用暴力高斯消元或者线性基
高斯消元法
高斯消元法详解
线性基入门
#include<bits/stdc++.h>
#define int long long
#define N 50005
using namespace std;
int n,x,ans,b[N];
inline bool insert(int x){
for (int i=60;~i;i--){
if (x>>i&1){
if (!b[i]){b[i]=x;return 1;}
else x^=b[i];
}
}
return 0;
}
signed main(){
scanf("%lld",&n);
for (int i=1;i<=n;i++){
scanf("%lld",&x);
ans^=insert(x);
}
if (ans) puts("First");else puts("Second");
return 0;
}
莫比乌斯反演的应用
莫比乌斯反演
这个的证明有点问题,看看结论就好了
应用:
莫比乌斯线性筛:
const int N=50000;
bool is_prime[N+500];
int prime[N+50];
int mu[N+50];
ll sum[N+50];
ll tot;
void Moblus()
{
tot = 0;
mu[1] = 1;
for(ll i = 2; i < N; i++)
{
if(!is_prime[i])
{
prime[tot++] = i;
mu[i] = -1;
}
for(ll j = 0; j < tot && i*prime[j] < N; j++)
{
is_prime[i*prime[j]] = 1;
if(i % prime[j])
{
mu[i*prime[j]] = -mu[i];
}
else
{
mu[i*prime[j]] = 0;
break;
}
}
}
}