Wannafly Winter Camp 2020 Day 5J Xor on Figures - 线性基,bitset
有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置(超出部分就循环,\(2^k\) 的下一个就是 \(1\)),然后相应位置相异或。现在可以执行任意次以上操作:将 \(F\)放于某个位置,执行对应的异或操作。问最后不同的 \(M\)有多少个。
Solution
很显然我们可以 \(F\) 放在每一个位置的异或结果都算出来,放在一起,变成一个集合,那么最终的答案就是这个集合内的元素相互异或,有多少种不同的结果。
把它压成一个串,这样每个结果就是一个向量。把它们视作一个向量组,那么在异或的意义下,设它的秩是 \(r\),则答案显然是 \(2^r\)
求线性基,搬运一个板子,把 int
换成 bitset
即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7;
int n;
char s[35][35];
int a[35][35],b[35][35];
struct linear_base {
bitset <1024> a[1024];
void insert(bitset<1024> k) {
for(int j=1023; j>=0; --j)
if((k>>j)[0])
if(a[j]==0) {a[j]=k;break;}
else k^=a[j];
}
int count() {
int ans=0;
for(int i=0;i<1024;i++) if(a[i]!=0) ++ans;
return ans;
}
} lb;
signed main() {
scanf("%d",&n);
for(int i=1;i<=(1<<n);i++) {
scanf("%s",s[i]+1);
}
for(int i=1;i<=(1<<n);i++) {
for(int j=1;j<=(1<<n);j++) {
a[i][j]=s[i][j]-'0';
}
}
for(int i=1;i<=(1<<n);i++) {
for(int j=1;j<=(1<<n);j++) {
bitset<1024>x;
for(int k=1;k<=(1<<n);k++) {
for(int l=1;l<=(1<<n);l++) {
b[k][l]=a[(k+i-2)%(1<<n)+1][(l+j-2)%(1<<n)+1];
x[k*(1<<n)-k+l-1]=b[k][l];
}
}
lb.insert(x);
}
}
int t=lb.count();
int ans=1;
for(int i=1;i<=t;i++) ans*=2,ans%=mod;
cout<<ans;
}
Wannafly Winter Camp 2020 Day 5J Xor on Figures - 线性基,bitset的更多相关文章
- Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分
给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...
- Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...
- Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学
于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...
- Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组
给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...
- Wannafly Winter Camp 2020 Day 6J K重排列 - dp
求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...
- Wannafly Winter Camp 2020 Day 6I 变大! - dp
给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...
- Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...
- Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学
给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...
- Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心
你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...
随机推荐
- Uncaught Error: Call to undefined function mcrypt_get_iv_size() 解决办法
函数 mcrypt_get_iv_size 在只在(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0) 这几个版本 ...
- Cacti 升级
现在用的 cacti 1.0.3 决定升级一下cacti到最新版本 1.1.1 官方升级指导文件 Upgrading Cacti Backup the old Cacti database. ...
- Kvm 简介 安装 使用 桥接网络
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor: 它由 ...
- [Python]random生成随机6位验证码
#!/usr/bin/env pyhton # coding:utf-8 # @Time : 2020-02-16 10:07 # @Author : LeoShi # @Site : # @File ...
- python环境开发
Python3 下载 Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到: Python 官网:https://www.python.org/ 你可以在以下链接中下载 ...
- JavaScript——event事件详解
1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给这个元 ...
- Java自学-多线程 线程安全的类
Java常见的线程安全相关的面试题 步骤 1 : HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式 区别1: HashMap可以 ...
- css如何玩转有序无序列表项list样式
在无序列表ul>li中,无线列表的标志是出现在各列表前面的圆点.在有序列表ol>li中,前面默认带有数字,如何修改列表前面的项目符号,只需要通过list-style调整就好,常见的符号有( ...
- cesium1.63.1api版本贴地贴模型量算工具效果(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材.不少 ...
- redis中key键操作
keys */查看所有的key remoteSelf:1>select 0 "OK" remoteSelf:0>keys * 1) "SUBCRIBEMAP& ...