牛牛数数 【线性基+二分】

2024-04-14 16:38
文章标签 二分 线性 牛牛 数数

本文主要是介绍牛牛数数 【线性基+二分】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:https://ac.nowcoder.com/acm/contest/10845/E
来源:牛客网

在这里插入图片描述
保证答案在long long内。

解法

这题可以说是线性基的模板题。先学习一下线性基:
线性基视频
处理完线性基之后,就可以使用其性质4:

  1. 求任意子集xor最大值: 把线性基中所有元素xor起来
  2. 求任意子集xor最小值: 等于最小的主元
  3. 查询x是否在值域中: 如果x能插入线性基,则x不能被当前线性基xor出来
  4. 查询第k小的值: 把k进行二进制分解,把1对应位置的主元xor起来;注意这里第0小就是0
  5. 求任意子集与x进行xor的最大值:从高->低贪心,若xor上a[j]能变大就xor

然后进行二分,二分到第一个大于k的数在线性空间中能排第几。如果线性基中有n个主元,那么一共有 2 n 2^{n} 2n种不同数在线性空间中。然后答案就是 最 后 一 个 排 名 ( 2 n − 1 ) − 第 一 个 大 于 k 的 排 名 + 1 最后一个排名(2^{n}-1) - 第一个大于k的排名 + 1 (2n1)k+1

代码

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <iostream>
#include <map>
#include <cmath>
#include <set>#define go(i, l, r) for(int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define god(i, r, l) for(int i = (r), i##end = (int)(l); i >= i##end; --i)
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug_in  freopen("in.txt","r",stdin)
#define debug_out freopen("out.txt","w",stdout);
#define pb push_back
#define all(x) x.begin(),x.end()
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
const ll maxn = 1e6+10;
const ll maxM = 1e6+10;
const ll inf_int = 1e8;
const ll inf_ll = 1e17;template<class T>void read(T &x){T s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();x = s*w;
}
template<class H, class... T> void read(H& h, T&... t) {read(h);read(t...);
}void pt(){ cout<<'\n';}
template<class H, class ... T> void pt(H h,T... t){ cout<<" "<<h; pt(t...);}//--------------------------------------------int N,L = 62;
ll K;
ll a[maxn];
int zero = 0;
bool insert(ll x){ //线性基插入模板for(int j = L;j>=0;j--){if((x>>j & 1LL) == 0) continue;if(a[j]){x ^= a[j];continue;}for(int k = j - 1;k>=0;k--){if((x>>k & 1LL)){x ^= a[k];}}for(int k = L;k>j;k--){if((a[k]>>j & 1LL)){a[k] ^= x;}}a[j] = x;return 1;}return 0;
}
ll judge(ll mid){ll ans = 0;int tag = 1;for(int j = 0;j<=L;j++){if(a[j] == 0) continue;if(mid & 1LL){ans ^= a[j];}mid/=2;}return ans;
}
void solve(int cnt){ll total = 1LL<<cnt;ll l = 0,r = (1LL<<cnt)-1,ans = total+1;while(l<=r){ll mid = (l+r)>>1;if(judge(mid) > K) {r = mid-1,ans = mid;}else l = mid+1;}if(ans >= total) puts("0");else{printf("%lld\n",total-1 - ans + 1);}}int main() {
//    debug_in;
//    debug_out;read(N,K);int cnt = 0;go(i,1,N) {ll x;read(x);if(insert(x)) cnt++;}solve(cnt);return 0;
}

这篇关于牛牛数数 【线性基+二分】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903483

相关文章

线性回归(Linear Regression)原理详解及Python代码示例

一、线性回归原理详解         线性回归是一种基本的统计方法,用于预测因变量(目标变量)与一个或多个自变量(特征变量)之间的线性关系。线性回归模型通过拟合一条直线(在多变量情况下是一条超平面)来最小化预测值与真实值之间的误差。 1. 线性回归模型         对于单变量线性回归,模型的表达式为:         其中: y是目标变量。x是特征变量。β0是截距项(偏置)。β1

DataWhale机器学习——第三章线性模型笔记

读书笔记: 《机器学习》第三章 线性模型 3.1 基本形式 3.1.1 线性模型的定义 3.1.2 线性模型的优点 简单易理解计算效率高容易实现和解释 3.1.3 线性模型的局限性 只能表达线性关系对于复杂的非线性关系,表现较差 3.2 线性回归 3.2.1 基本概念 3.2.2 最小二乘法 正规方程 3.2.3 正则化 为防止过拟合,可以在损失函数中加入正

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re

高级线性回归模型详解

高级线性回归模型详解 在线性回归模型的基础上,有许多高级的技巧和方法可以进一步提高模型的性能和解释能力。本文将详细介绍多元线性回归、交互项、正则化方法(岭回归和套索回归)、多重共线性处理及模型诊断等高级主题。 目录 多元线性回归交互项正则化方法 岭回归套索回归 多重共线性处理模型诊断总结 多元线性回归 多元线性回归是线性回归的一种扩展形式,涉及多个自变量。其数学表达式为: Y = β

计数排序(第8章线性时间排序)

根据《算法导论》第八章算法实现下面函数,详见《算法导论》第八章计数排序,程序可运行: #include <STDLIB.H>#include <STDIO.H>#include <MALLOC.H>#include <STRING.H>/********************************************************* 函数名: void COUNTI

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

第六章线性模型选择+正则化

目录 什么是正则化(防止过拟合) 正则化的作用 正则化参数λ 第一题 第二题 回答 第三题 回答 第四题 回答 什么是正则化(防止过拟合) 正则化(Regularization)是指在机器学习和统计学中,通过引入额外的约束或惩罚项来防止模型过拟合的一种技术。过拟合是指模型在训练数据上表现很好,但在测试数据或新数据上表现较差的现象。正则化通过限制模型的复杂度,从而提高模型

leetcode 二分查找·系统掌握 第一个错误版本

题意: 题解: 就是经典的~01~泛型查找,而且一定存在这样错误的版本所以查找不会"失败",返回每次查找结果即可。 int firstBadVersion(int n) {long l=1,r=n,mid;while(l<r){mid=(l+r)>>1;if(isBadVersion(mid))r=mid;else l=mid+1;}return l;}

leetcode 二分查找·系统掌握 搜索二维矩阵

题目: 题解: 一个可行的思路是使用~01~泛型对每一行的最后一个元素进行查找找到第一个大于等于target的那一行,判断查找结果如果“失败”返回false否则继续在改行进行常规二分查找target的值根据查找结果返回即可。 bool searchMatrix(vector<vector<int>>& matrix, int target) {int l=0,r=matrix.size()-