【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. python #!/usr/bin/python 的作用

    在说之前,这里推荐写: #!/usr/bin/env python 进入正题,在 Python 里面第一行代码: #!/usr/bin/python 其他有的可能是 python2 或者 python ...

  2. php curl 传递数据

    <?php header("Content-type: text/html; charset=utf-8"); /** * curl 传递数据 */ class curl { ...

  3. PHP 之源代码加密与解密,加密后可直接运行

    方式一: <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/10/16 * Time: 10:25 */ class Enci ...

  4. [信息收集]Nmap命令详解

    0x00[介绍] Nmap,也就是Network Mapper,中文为"网络映射器". Nmap是一款开源的网络探测和安全审核的工具,它的设计目标是快速地扫描大型网络. 它是网络管 ...

  5. qt 关于Qt中MVC的介绍与使用

    Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户.这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中. 模型 ...

  6. arcgis python 不知道一个工具怎么用

    完整的工具帮助信息 import arcpy print(arcpy.Usage("Buffer_analysis")) print(arcpy.Usage("MakeF ...

  7. 微信小程序 scroll-view 填满剩余可用高度

    根据微信小程序 scroll-view 文档所述,scroll-view必须给定一个固定高度.那么如果我们想要让它自动填充剩余高度,该怎么办呢? 前言 在说出我的解决方案之前,先来看一下我的页面设计, ...

  8. 【Oracle/Maven】Maven导入oracle11g 自携带jdbc驱动包ojdbc6.jar到本地库

    Maven需要下载解压并添加到classpath,如果不明可以参考https://www.cnblogs.com/xiandedanteng/p/11403480.html 然后在命令行窗口执行: m ...

  9. finder文件夹字体大小能不能统一修改

  10. oracle库两个表关联查询时用 count 报错【我】

    oracle数据库,需要对两个表进行关联查询(根据两个字段),结果发现关联后不能改为 count 获取数量,报错如下: 同样的sql换到另外一个数据库就可以(只是因为数据量在千万级,所以很慢,用时40 ...