P4869 albus就是要第一个出场(线性基+集合规律)

本文讲述了作者通过两次代码迭代,从最初的误判QQQ之前数字个数,到修正后的算法,利用线性基和哈希技巧解决计数问题。关键在于重新遍历并判断线性基,确保正确计算特定区间内的元素数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

在正式的结论推导之前,先由以下的例子进行举例:

在这里插入图片描述

然而一不小心默认成了所有线性基都存在,导致误判出了 Q Q Q 之前正好有 Q Q Q 个数(即 0 0 0 Q − 1 Q-1 Q1 )的错误结论,于是第一发喜提 70 70 70 分。AC 代码还需要往下翻

70分(未判 Q 之前有多少个数)代码

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N=105;
const int mod=10086;
int p[N];

int ksm(int a,int k){ 
    int res=1;
    while(k){
        if(k&1) res=res*a%mod;
        a=a*a%mod;
        k/=2;
    }
    return res;
}

void insert(int x){
	for(int i=60;i+1;i--){
		if(!(x>>i))
			continue;
		if(!p[i]){
			p[i]=x;
			break;
		}
		x^=p[i];
	}
}

signed main(){
	int n;
	cin>>n;
	int a;
	for(int i=1;i<=n;i++){
		cin>>a;
		insert(a);
	}
	int cnt=0;
	for(int i=60;i+1;i--){
		if(p[i])
			cnt++;//统计线性基的个数 
	}
	cnt=ksm(2,n-cnt);
	//cout<<cnt;
	cin>>a;
	cout<<((a*cnt)+1)%mod;	
	
	return 0;
}

/*
5
6 2 5 4 7
3
*/

吸取教训之后,重新遍历所有的线性基判断 Q Q Q 之前存在的数的个数

AC参考

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N=105;
const int mod=10086;
int p[N];
vector<int> ans; 

int ksm(int a,int k){ 
    int res=1;
    while(k){
        if(k&1) res=res*a%mod;
        a=a*a%mod;
        k/=2;
    }
    return res;
}

void insert(int x){
	for(int i=60;i+1;i--){
		if(!(x>>i))
			continue;
		if(!p[i]){
			p[i]=x;
			break;
		}
		x^=p[i];
	}
}

signed main(){
	int n;
	cin>>n;
	int a;
	for(int i=1;i<=n;i++){
		cin>>a;
		insert(a);
	}
	for(int i=0;i<=60;i++)
		if(p[i])
			ans.push_back(i);
	int cnt=ksm(2,n-ans.size());
	
	cin>>a;
	int sum=0;
	
	for(int i=0;i<ans.size();i++){
		if(a>>ans[i]&1)
			sum+=1<<i;
	}
	cout<<((sum*cnt)+1)%mod;
	return 0;
}

/*
5
6 2 5 4 7
3
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值