BZOJ_2844 albus就是要第一个出场 【线性基】
一、题目
二、分析
非常有助于理解线性基的一题。
构造线性基$B$后,如果$|A| > |B|$,那么就意味着有些数可以由$B$中的数异或出来,而多的数可以取或者不取,相当于每多一个数,那么线性基能生成的数的子集的种类就可以乘以$2$,最终就是乘以$2^{|A|-|B|}$。
所以对于给定的$Q$,要确定它是由哪些位置的线性基中的数生成的,然后确定它在不重复序列中的位置,然后再乘以$2^{|A|-|B|}$,最终还需要$+1$,因为前面求的其实是不包含这个数的子集总个数。
三、AC代码
1 #include <bits/stdc++.h>
2
3 using namespace std;
4 #define ll long long
5 #define Min(a,b) ((a)>(b)?(b):(a))
6 #define Max(a,b) ((a)>(b)?(a):(b))
7 const int MAXN = 1e5 + 13;
8 const int MAXL = 30;
9 const int mod = 10086;
10 int base[MAXL + 2];
11
12 int Pow(int a, int b)
13 {
14 int ans = 1;
15 while(b) {
16 if(b & 1) ans = ans * a % mod;
17 b >>= 1;
18 a = a * a % mod;
19 }
20 return ans;
21 }
22
23
24 int main()
25 {
26 //freopen("input.txt", "r", stdin);
27 //freopen("out.txt", "w", stdout);
28 int n, a, cnt = 0, q;
29 scanf("%d", &n);
30 memset(base, 0, sizeof(base));
31 for(int i = 0; i < n; i++) {
32 scanf("%d", &a);
33 for(int j = MAXL; j >= 0; j--) {
34 if(a & (1<<j)) {
35 if(base[j])
36 a ^= base[j];
37 else {
38 base[j] = a;
39 for(int k = j - 1; k >= 0; k--) {
40 if(base[j] & (1<<k) )
41 base[j] ^= base[k];
42 }
43 for(int k = j + 1; k <= MAXL; k++) {
44 if(base[k] & (1<<j) )
45 base[k] ^= base[j];
46 }
47 cnt++;
48 break;
49 }
50 }
51 }
52 }
53 scanf("%d", &q);
54 vector<int> pos;
55 int p = 0, res = 0;
56 for(int i = 0; i <= MAXL; i++) {
57 if(base[i]) pos.push_back(i);
58 }
59 for(int i = 0; i < pos.size(); i++) {
60 if(q>>pos[i] & 1) {
61 res += (1<<i);
62 }
63 }
64 printf("%d\n", (res % mod * Pow(2, n - cnt) % mod + 1)%mod );
65 return 0;
66 }
BZOJ_2844 albus就是要第一个出场 【线性基】的更多相关文章
- bzoj 2844 albus就是要第一个出场 - 线性基
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 给定集合$S$,现在将任意$A\subseteq S$中的元素求异或和,然后存入一个数组中(下标从1开始),然后从小到大排 ...
- albus就是要第一个出场(线性基)
传送门 这个题题目描述真怪异--就不能说人话吗-- 人话:给定长为n的序列A,定义f(s)为集合s内所有元素异或值,求A的所有子集的f值从小到大排列后,q在其中第一次出现的下标对10086取模的值. ...
- BZOJ2844: albus就是要第一个出场(线性基)
Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 2054 Solved: 850[Submit][Status][Discuss] Descriptio ...
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
- 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...
- CF895C: Square Subsets && 【BZOJ2844】albus就是要第一个出场
CF895C: Square Subsets && [BZOJ2844]albus就是要第一个出场 这两道题很类似,都是线性基的计数问题,解题的核心思想也一样. CF895C Squa ...
- BZOJ 2844: albus就是要第一个出场
2844: albus就是要第一个出场 Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 1134 Solved: 481[Submit][Status] ...
- 2844: albus就是要第一个出场
2844: albus就是要第一个出场 链接 分析: 和HDU3949差不多互逆,这里需要加上相同的数. 结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
随机推荐
- NIST随机数测试软件安装与使用 && igamc:UNDERFLOW
https://csrc.nist.gov/ https://csrc.nist.gov/projects/random-bit-generation/documentation-and-softwa ...
- C++ STL (基础)
STL是什么(STL简介) 本节主要讲述 STL 历史.STL 组件.STL 基本结构以及 STL 编程概述.STL 历史可以追溯到 1972 年 C 语言在 UNIX 计算机上的首次使用.直到 19 ...
- Tomcat基本原理
思考 :怎样让Tomcat具备Web服务的功能呢? 在服务端用HTTP来监听,协议不好写,不妨用Java封装好的Socket作为监听. class MyTomcat{ ServerSocket ser ...
- 【Alpaca】.Net版开源配置中心 - 技术选型 Vue 3.0
是否可以用 Vue 3.0 现有的Vue 2.* 不推荐,坐等Vue 3.0出迁移工具吧,手动改的话工作量还是不小的 新项目 考虑下团队内对Vue + TS + VS Code的熟练程度.过程中你会遇 ...
- React PureComponent All In One
React PureComponent All In One import React, { // useState, // useEffect, // Component, PureComponen ...
- Xcode 切换 iOS 模拟器的 Dark 模式
Xcode 切换 iOS 模拟器的 Dark 模式 SwiftUI // // ContentView.swift // MemorizeGame // // Created by 夏凌晨 on 20 ...
- 微信小程序 TypeScript bug
微信小程序 TypeScript bug 执行自定义预览前预处理命令失败! internal/modules/cjs/loader.js:584 throw err; ^ Error: Cannot ...
- Inspect Network Activity In Chrome DevTools
Inspect Network Activity In Chrome DevTools https://developers.google.com/web/tools/chrome-devtools/ ...
- Linux & SIGUSER1
Linux & SIGUSER1 https://stackoverflow.com/questions/10824886/how-to-signal-an-application-witho ...
- py pandas
import pandas as pd class Main(): def __init__(self): # 读取excel self.df = pd.read_excel("C:\\Us ...