【51nod】 2622 围绕着我们的圆环

kcz出的一道比赛题

第一次写带修改的线性基

ps:我觉得我计数计的好麻烦

首先是这个可以认为第二个矩阵是\(q\)个\(s\)位数,如果这\(q\)个数的线性基可以消掉\(C\)中每一行,那么答案就应该是,设线性基个数是\(x\),则应该是\(2^{q - x}\)随便选,然后剩下的用线性基消掉即可,所以系数是\(2^{p(q - x)}\)(因为第一个矩阵有\(p\)行)

那么问题就来了,我们要统计以下两个东西

1.\(q\)个\(s\)位数组成\(x\)个线性基的方案数

2.找到\(x\)个线性基,这些线性基可以消掉\(p\)个给定的数的方案数,线性基不同仅当它们组成的数字不同

第一个我们分两步,按照我们加入线性基的思路来说,设\(dp[i][j]\)为前\(i\)个数有\(j\)个线性基

为了方便,这里分两步,认为我们加入的线性基是固定的数,然后再求出\(j\)个线性基有多少种不同的数字方案

所以就是如果要加入一个线性基,就\(dp[i][j] \rightarrow dp[i + 1][j + 1]\)

否则就是前\(j\)个线性基可以组成的数,\(2^{j}dp[i][j] \rightarrow dp[i + 1][j]\)

然后线性基有\(j\)个,有多少种不同的数字能构成呢

就是\((2^{j} - 2^{0})(2^{j} - 2^{1})(2^{j} - 2^{2})....(2^{j} - 2^{j - 1})\)

就是第一个数字有\(2^{j} - 1\)种选法,第二个数字要减去第一个可以拼出来的……

然后我们把两个东西乘起来得到\(f[x]\)表示第一步的答案

设\(p\)个数字组成的线性基个数是\(cnt\)

那么可以把\(x\)个线性基变成\(x - cnt\)个,值域变成\(2^{s - cnt}\)

这显然是等价的

我们如果选了\(k\)个,则下一个的可选的个数是\(2^{s - cnt} - 2^{k}\)

算完之后除去方案数即可(因为等价的线性基会算重方案数那么多次)

最后再乘上系数\(2^{p(q- x)}\)即可

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int p,q,s,m,k,pos[1005],cnt;
bitset<1005> c[1005],fr[1005],rec[1005],nw;
int dp[1005][1005],f[1005],pw[1005],g[1005],rf[1005];
bool used[1005];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = mul(res,t);
t = mul(t,t);
c >>= 1;
}
return res;
}
void Insert(int t) {
for(int j = 0 ; j < s ; ++j) {
if(c[t][j]) {
if(pos[j]) {
c[t] ^= c[pos[j]];
fr[t] ^= fr[pos[j]];
}
else {
pos[j] = t;++cnt;used[t] = 1;break;
}
}
}
}
void Calc() {
for(int i = 1 ; i <= p ; ++i) {
fr[i][i] = 1;
Insert(i);
}
}
int Getans() {
memset(g,0,sizeof(g));
g[cnt] = 1;
for(int i = cnt + 1 ; i <= min(s,q) ; ++i) {
g[i] = mul(g[i - 1],inc(pw[s - cnt],MOD - pw[i - cnt - 1]));
}
for(int i = cnt ; i <= min(s,q) ; ++i) {
g[i] = mul(g[i],fpow(rf[i - cnt],MOD - 2));
}
int res = 0;
for(int i = cnt ; i <= min(s,q) ; ++i) {
int t = fpow(pw[q - i],p);
update(res,mul(f[i],mul(g[i],t)));
}
return res;
}
void Modify(int l) {
int t = -1,h = 0;
for(int j = s - 1 ; j >= 0 ; --j) {
if(fr[pos[j]][l]) {t = j;break;}
}
for(int i = 1 ; i <= p ; ++i) {
if(!used[i]) {
if(fr[i][l]) {h = i;break;}
}
}
if(h) {
for(int i = 1 ; i <= p ; ++i) {
if(i != h && fr[i][l]) fr[i] ^= fr[h];
}
c[h] ^= nw ^ rec[l];
Insert(h);
}
else if(t != -1){
for(int j = t - 1 ; j >= 0 ; --j) {
if(fr[pos[j]][l]) {
fr[pos[j]] ^= fr[pos[t]];
c[pos[j]] ^= c[pos[t]];
}
}
int id = pos[t];
c[id] ^= nw ^ rec[l];
used[pos[t]] = 0;--cnt;
pos[t] = 0;
Insert(id);
}
rec[l] = nw;
}
void Solve() {
read(p);read(q);read(s);read(m);read(k);
int a;
for(int i = 1 ; i <= p ; ++i) {
for(int j = 0 ; j < s ; ++j) {
read(a);
c[i][j] = a;rec[i][j] = a;
}
}
pw[0] = 1;
for(int i = 1 ; i <= 1000 ; ++i) pw[i] = mul(pw[i - 1],2);
dp[0][0] = 1;
for(int i = 0 ; i <= q ; ++i) {
for(int j = 0 ; j <= i ; ++j) {
update(dp[i + 1][j + 1],dp[i][j]);
update(dp[i + 1][j],mul(dp[i][j],pw[j]));
}
}
for(int j = 0 ; j <= min(q,s) ; ++j) {
rf[j] = 1;
for(int k = 0 ; k < j ; ++k) {
rf[j] = mul(rf[j],inc(pw[j],MOD - pw[k]));
}
f[j] = mul(rf[j],dp[q][j]);
}
Calc();
int la = Getans();
out(la);enter;
int wz;
for(int i = 1 ; i <= m ; ++i) {
read(wz);wz ^= k * la;
for(int j = 0 ; j < s; ++j) {
read(a);nw[j] = a;
}
Modify(wz);
la = Getans();
out(la);enter;
}
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【51nod】2622 围绕着我们的圆环的更多相关文章

  1. 【UOJ453】【集训队作业2018】围绕着我们的圆环 线性基 DP

    题目大意 有一个 \(n\times k\) 的 01矩阵 \(C\),求有多少个 \(n\times m\) 的矩阵 \(A\) 和 \(m\times k\) 的矩阵 \(B\),满足 \(A\t ...

  2. uoj#453. 【集训队作业2018】围绕着我们的圆环(线性代数+递推)

    题面 传送门 题解 我对线代一无所知 如果下面有啥说错的地方请说出来省的我一辈子都搞不明白 如果你没看懂以下在讲什么不要紧,因为我也没看懂 首先,关于\(A\times B \equiv C \pmo ...

  3. 51nod 1593 公园晨跑 | ST表(线段树?)思维题

    51nod 1593 公园晨跑 有一只猴子,他生活在一个环形的公园里.有n棵树围绕着公园.第i棵树和第i+1棵树之间的距离是 di ,而第n棵树和第一棵树之间的距离是 dn .第i棵树的高度是 hi ...

  4. 52.纯 CSS 创作一个小球绕着圆环盘旋的动画

    原文地址:https://segmentfault.com/a/1190000015295466 感想:重点在小球绕环转动. HTML code: <div class="contai ...

  5. 纯 CSS 创作一个小球绕着圆环盘旋的动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 ...

  6. 前端每日实战:52# 视频演示如何用纯 CSS 创作一个小球绕着圆环盘旋的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 此视频是可 ...

  7. css3线条围绕跑马+jquery打字机效果

    原文地址:css3线条围绕跑马+jquery打字机效果 有图有真相,今天偶然看到了一种效果,仔细看了下,发现它是用css的clip+css3的动画实现的,简直叼.于是自己拿来了前一阵子写的打字机效果, ...

  8. css3圆环百分比,菜单栏定位导航

    前段时间,社区个人中心改版,看了下设计图,当时隐约感觉到有两个地方(圆环百分比,菜单栏定位导航)比较麻烦.设计图大致如下: 首先看圆环百分比,网上的做法大致分两种,一种是用了CSS3中的transfo ...

  9. Android自定义View之圆环交替 等待效果

    学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...

随机推荐

  1. 小程序demo项目实践

    今天开始做一个简单的小程序,做的过程中势必会有一些知识经验需要记录 项目初始化 首先创建好一个小程序项目,在app.wxss里面将自带的css样式统统去除,加上自己写的初始化样式 小程序目前不支持*号 ...

  2. Visual Studio2019安装步骤

    学校使用的版本是2012版本,而现在讲的版本是2019版本,差别不大,个人认为2019更能胜任学习任务. 另外VS2019是完全免费的,版本越高越好了!毕竟C++都出了C++20对吧. Step 1: ...

  3. HDU 4609 3-idiots ——(FFT)

    这是我接触的第一个关于FFT的题目,留个模板. 这题的题解见:http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html. FFT的 ...

  4. Linux中的MySQL授权远程连接

    Linux中 MySQL 授权远程连接 参考地址:https://www.centos.bz/2018/10/linux%e4%b8%ad-mysql-%e6%8e%88%e6%9d%83%e8%bf ...

  5. Jenkins 获取 Git 的提交记录(Change Log)

    工作中用 Jenkins 做 iOS 和 Android 的持续集成,之前实现的是当 git 有新代码提交的时候,就会自动编译并上传安装包到蒲公英,然后自动发送QQ群通知或者讨论组通知给相关小伙伴,方 ...

  6. zoom:1的常见作用

    zoom是IE专用属性,firefox等是不支持的.它的本来作用是设置或检索对象的缩放比例,但这作用几乎用不到. 可以让网页实现IE7中的放大缩小功能.比如你想让你的网页缩小为原来的一半,那么就在bo ...

  7. mysql 和mssql2016中的json字段相关操作

    Mysql: mysql中有专门的Json字段,不是通用的varchar字段,可以保存key/value对,也可保存value集合. 可以增加.删除.修改Json中的某一字段,查询时可以为条件. 如果 ...

  8. Navicat Premium 12安装与激活(亲测已成功激活)

    说明:博主所提供的激活文件理论支持Navicat Premium 12.0.16 - 12.0.24简体中文64位,但已测试的版本为Navicat Premium 12.0.22.12.0.23和12 ...

  9. Java面试之http知识点(必问)

    Java面试之http知识点(必问)   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/q ...

  10. Ionic4.x 中的button

    官方文档:https://ionicframework.com/docs/api/button 1.ion-button 组件可以定义一个按钮 <ion-button>Default< ...