【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. 【零基础】神经网络优化之mini-batch

    一.前言 回顾一下前面讲过的两种解决过拟合的方法: 1)L0.L1.L2:在向前传播.反向传播后面加个小尾巴 2)dropout:训练时随机“删除”一部分神经元 本篇要介绍的优化方法叫mini-bat ...

  2. [RK3399] /bin/sh: 1: lz4c: not found

    CPU:RK3399 系统:Android 8.1 第一次在 RK3399 编译 Android 8.1 的系统,编译内核过程中报错如下: /bin/sh: : lz4c: not found mak ...

  3. 完全基于卷积神经网络的seq2seq

    本文参考文献: Gehring J, Auli M, Grangier D, et al. Convolutional Sequence to Sequence Learning[J]. arXiv ...

  4. sqlserver 触发器语法

    语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER ...

  5. 原生JavaScript实现函数的防抖和节流

    原生JavaScript实现函数的防抖和节流 参考:https://www.jianshu.com/p/c8b86b09daf0 想详细了解的直接戳上面链接了,讲得非常清楚.下面只给代码和我自己写的注 ...

  6. 编译freeglut

    下载freeglut  http://freeglut.sourceforge.net/ 1>------ 已启动生成: 项目: CallbackMaker, 配置: Debug x64 --- ...

  7. 查看linux是几位操作系统

    查看linux是几位操作系统 摘自:https://blog.csdn.net/a34569345/article/details/80179927 2018年05月03日 14:44:44 bill ...

  8. 简单模拟 Promise

    class promise { constructor(fn) { this.data = null; this.err = null; this.isPromise = false; this.er ...

  9. 【419】C语言语句

    判断语句 C 语言提供了以下类型的判断语句.点击链接查看每个语句的细节. 语句 描述 if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成. if...else 语句 一个 if 语句 ...

  10. 123457---com.twoapp.shuXueYouXi---小学数学口算

    com.twoapp.shuXueYouXi---小学数学口算