有一个\(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的更多相关文章

  1. Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分

    给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...

  2. Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学

    神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...

  3. Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学

    于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...

  4. Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组

    给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...

  5. Wannafly Winter Camp 2020 Day 6J K重排列 - dp

    求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...

  6. Wannafly Winter Camp 2020 Day 6I 变大! - dp

    给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...

  7. Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心

    对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...

  8. Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学

    给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...

  9. Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心

    你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...

随机推荐

  1. pytorch之 Variable

    import torch from torch.autograd import Variable # Variable in torch is to build a computational gra ...

  2. zookeeper从入门到放弃

    第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...

  3. RFC笔记,IPv6 Node Requirements

    Request for Comments: 6434,IPv6 Node Requirements 路由器节点必须能够生成链路本地地址 5.9.2. IPv6 Stateless Address Au ...

  4. H5浏览器强制手机横屏

    H5强制手机横屏 1. 通过screen.orientation可以定义手机屏幕的方向,但是lock()方法仅在浏览器已经通过requestFullscreen()切换到全屏模式时起作用,例:强制手机 ...

  5. [CSS]important提升直选标签优先级

    <style> #identity{ color: purple; } p { color: yellowgreen !important; } </style> <!- ...

  6. FakeLogonScreen抓取Windows凭证

    FakeLogonScreen抓取Windows凭证 实践中使用的配置 攻击者: 操作系统: Kali Linux 2020.1 IP: 192.168.1.13 目标: 作业系统: Windows ...

  7. jQuery on 绑定的事件 执行两次

    $(".class1").on("click",".class2",function(){ alert('提示'); }); 上面代码,怎么 ...

  8. Javascript 基础学习(五)js 的运算符

    通过运算符可以对一个或多个值进行运算,并且一定有运算结果返回 算数运算符 ​ 算数运算符包括相加(+).相减(-).相乘(*).相除(/).取模(%).任何值与字符串相加都会转换为字符串,做的是字符串 ...

  9. MFC/QT 学习笔记(一)——认识windows基础库

    MFC (微软基础类库),Windows系统平台做GUI尚且OK,但不支持跨平台. //Windows消息机制: //1.SDK与API Software Development Kit,为特定软件框 ...

  10. Python——捕获异常

    一.什么是异常 """异常:错误,bug处理异常:尝试执行某句可能出现异常的语句, 若出错则用正确的代码去替代. try: 可能发生错误的代码except: 如果出现异常 ...