【51nod】2622 围绕着我们的圆环
【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 围绕着我们的圆环的更多相关文章
- 【UOJ453】【集训队作业2018】围绕着我们的圆环 线性基 DP
题目大意 有一个 \(n\times k\) 的 01矩阵 \(C\),求有多少个 \(n\times m\) 的矩阵 \(A\) 和 \(m\times k\) 的矩阵 \(B\),满足 \(A\t ...
- uoj#453. 【集训队作业2018】围绕着我们的圆环(线性代数+递推)
题面 传送门 题解 我对线代一无所知 如果下面有啥说错的地方请说出来省的我一辈子都搞不明白 如果你没看懂以下在讲什么不要紧,因为我也没看懂 首先,关于\(A\times B \equiv C \pmo ...
- 51nod 1593 公园晨跑 | ST表(线段树?)思维题
51nod 1593 公园晨跑 有一只猴子,他生活在一个环形的公园里.有n棵树围绕着公园.第i棵树和第i+1棵树之间的距离是 di ,而第n棵树和第一棵树之间的距离是 dn .第i棵树的高度是 hi ...
- 52.纯 CSS 创作一个小球绕着圆环盘旋的动画
原文地址:https://segmentfault.com/a/1190000015295466 感想:重点在小球绕环转动. HTML code: <div class="contai ...
- 纯 CSS 创作一个小球绕着圆环盘旋的动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 ...
- 前端每日实战:52# 视频演示如何用纯 CSS 创作一个小球绕着圆环盘旋的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 此视频是可 ...
- css3线条围绕跑马+jquery打字机效果
原文地址:css3线条围绕跑马+jquery打字机效果 有图有真相,今天偶然看到了一种效果,仔细看了下,发现它是用css的clip+css3的动画实现的,简直叼.于是自己拿来了前一阵子写的打字机效果, ...
- css3圆环百分比,菜单栏定位导航
前段时间,社区个人中心改版,看了下设计图,当时隐约感觉到有两个地方(圆环百分比,菜单栏定位导航)比较麻烦.设计图大致如下: 首先看圆环百分比,网上的做法大致分两种,一种是用了CSS3中的transfo ...
- Android自定义View之圆环交替 等待效果
学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...
随机推荐
- python qq发消息
# 原理是先将需要发送的文本放到剪贴板中,然后将剪贴板内容发送到qq窗口 # 之后模拟按键发送enter键发送消息 import win32gui import win32con import win ...
- YII框架入门
一.安装 php运行环境安装包:http://www.phpstudy.net/a.php/207.html Yii安装包: https://github.com/yiisoft/yii2/relea ...
- enablePullDownRefresh的使用
1.首先要在app.json里面去将enablePullDownRefresh设置为true. 2.js 3.现象
- AT1357 n^p mod m(洛谷)
题意翻译 求 n^p mod m 的值 输入格式 一行,为整数 n,m,p(注意顺序) 输出格式 一行,为 n^p mod m 的值 数据说明 对于100%的数据 1≤n,m≤10^91≤n,m≤10 ...
- vue+php接口
php: <?php header('Access-Control-Allow-Origin:*'); $date = $_POST['data'];$cars=array("Volv ...
- sed替换 - 含斜杠(\)和Shell变量
gen_image.bat中的内容如下: FOTARomPacker.exe -i .\_ini\FOTARomPacker.ini -o .\_Output\a.bin @IF %ERRORLE ...
- CentOS7下搭建zabbix监控(二)——Zabbix被监控端配置
Zabbix监控端配置请查看:CentOS7下搭建zabbix监控(一)——Zabbix监控端配置 (1).在CentOS7(被监控端)上部署Zabbix Agent 主机名:youxi2 IP地址: ...
- 关于jmeter+ant+jenkins性能自动化将测试结果文件jtl转换成html文件遇到的问题。
1.ant自身缺陷,返回结果中有特殊字符,乱码字符,无法识别,jtl文件转换时报错. 2.jtl文件过大转换成html文件时出现内存溢出. 针对以上情况:可考虑使用BeenShell Sampler: ...
- 无法连接App Store
试了很多网上的方法,都没有效果,最后把hosts文件清空了,就可以了,不知道是为啥,同一份hosts文件在屋里能用,公司就不能用.
- Python3之类和实例继承和多态
在OPP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类,父类或超类 例如,我们已经编写了一个名为A ...