【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. 5、创建RDD(集合、本地文件、HDFS文件)

    一.创建RDD 1.创建RDD 进行Spark核心编程时,首先要做的第一件事,就是创建一个初始的RDD.该RDD中,通常就代表和包含了Spark应用程序的输入源数据.然后在创建了初始的RDD之后,才可 ...

  2. HDU 6041 I Curse Myself ——(仙人掌图,tarjan,转化)

    题解见这个博客:http://blog.csdn.net/ME495/article/details/76165039. 复杂度不太会算..这个经典问题的解法需要注意,维护队列里面只有k个元素即可.另 ...

  3. ICEM-三棱锥的一种画法(2D转3D)

    原视频下载地址:https://yunpan.cn/cqwC3eZHn5AvJ  访问密码 9456

  4. 爬虫前提——正则表达式语法以及在Python中的使用

    正则表达式是用来处理字符串的强大工具,他并不是某种编程云. 正则表达式拥有独立的承受力引擎,不管什么编程语言,正则表达式的语法都是一样的. 正则表达式的匹配过程 1.一次拿出表达式和文本中的字符比较. ...

  5. C++的面向对象的Dijkstra写法

    C++的面向对象的Dijkstra写法 面向对象特点的充分使用 清晰的逻辑 简洁的图输入 程序 面向对象特点的充分使用 清晰明确的类实现 class Edge(边的实现) class Req (路由请 ...

  6. java实现哈夫曼树进行文件加解压

    目录 1.哈夫曼树简述 2.构造树的节点 3.构造哈夫曼树的类(压缩) 4.构造哈夫曼树的类(解压) 5.整体工程文件(包括测试类) 6.结果 7.参考链接 1.哈夫曼树简述 给定n个权值作为n个叶子 ...

  7. 激活函数,Batch Normalization和Dropout

    神经网络中还有一些激活函数,池化函数,正则化和归一化函数等.需要详细看看,啃一啃吧.. 1. 激活函数 1.1 激活函数作用 在生物的神经传导中,神经元接受多个神经的输入电位,当电位超过一定值时,该神 ...

  8. cin中的注意事项

    猎豹网校C++ Primer学习笔记 - ostartech - 博客园 https://www.cnblogs.com/wxl845235800/p/11396323.html 在VS中使用cin& ...

  9. NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法(转)

    NTC热敏电阻计算器使用方法 NTC热敏电阻计算器 V1.0 10K负温度系数热敏电阻(NTC)温度与阻值对应关系表 Rt = R(25℃)*EXP[B*(1/T - 1/(T+25))] 说明: 1 ...

  10. 安卓打包apk

    打apk包的环境依赖 1.jdk 2.sdk 3.ndk 打apk包的工具 gradle mkdir /usr/local/Android cd /usr/local/Android mkdir sd ...