暑假集训日记——7.24(牛客+一堆算法)

筱玛爱游戏
题解:
这题需要一些线性代数的知识
每个数可以看做一个 向量(即每一维都是 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;
}

树形dp入门

康拓展开及应用

莫比乌斯反演的应用

莫比乌斯反演
这个的证明有点问题,看看结论就好了

应用:
在这里插入图片描述
莫比乌斯线性筛:

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;
            }
        }
    }
}

莫比乌斯思想的应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值