题目链接


\(Description\)

给定一个\(n\times m\)的\(01\)矩阵。求任意选出\(r\)行、\(c\)列(共\(2^{n+m}\)种方案),使得这\(r\)行\(c\)列的交的位置的\(r\times c\)个数的和为奇数,的方案数有多少。

(...我也不知道怎么就表述成这样了,反正挺好理解)

\(n,m\leq300\)。

\(Solution\)

假设已经确定了选择某些行,然后把每一行\(m\)个数看做一个\(m\)位二进制数。

如果这些行异或和为\(0\),那怎么选列也不行。

否则每一列异或这些行是\(0\)还是\(1\)是确定的。假设有\(a\)列异或后为\(1\),\(b\)列异或后为\(0\),\(a+b=m\)。我们要从\(a\)中选出奇数个,从\(b\)中随便选,那么方案数是\(2^{a-1}\cdot2^b=2^{m-1}\)(从\(n\)中选出奇数个数的方案数。。\(C_n^1+C_n^3+C_n^5+...=\frac{2^n}{2}=2^{n-1}\))。

也就是不管行怎么选,只要异或和不为\(0\),列就有\(2^{m-1}\)种方案。

异或和不为\(0\)的方案数=\(2^n-\)异或和为\(0\)的方案数。异或和为\(0\)的方案数可以用线性基求,是\(2^{n-r}\)(\(n\)是元素总数,\(r\)是矩阵的秩,也就是线性基中的元素个数),所以答案就是\((2^n-2^{n-r})\cdot2^{m-1}\)。

这里线性基插入还是一样的,把一行看做\(m\)位数就好了。

复杂度\(O(n^3)\)或\(O(\frac{n^3}{w})\)。


//7ms	896KB
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define mod 998244353
typedef long long LL;
const int N=305; int A[N][N],B[N][N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
} int main()
{
int n=read(),m=read();
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j) A[i][j]=read();
int r=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
if(A[i][j])//x>>j&1
{
if(B[j][j]) for(int k=j; k<=m; ++k) A[i][k]^=B[j][k];
else
{
for(int k=j; k<=m; ++k) B[j][k]=A[i][k];
++r; break;
}
}
printf("%d\n",(FP(2,n+m-1)+mod-FP(2,n-r+m-1))%mod); return 0;
}

bitset优化:

//5ms	256KB
#include <cstdio>
#include <cctype>
#include <bitset>
#include <algorithm>
#define gc() getchar()
#define mod 998244353
typedef long long LL;
const int N=305; std::bitset<N> A[N],B[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
} int main()
{
int n=read(),m=read();
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j) A[i][j]=read()==1;
int r=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
if(A[i][j])//x>>j&1
{
if(B[j][j]) A[i]^=B[j];
else
{
B[j]=A[i];
++r; break;
}
}
printf("%d\n",(FP(2,n+m-1)+mod-FP(2,n-r+m-1))%mod); return 0;
}

Yahoo Programming Contest 2019.E.Odd Subrectangles(思路 线性基)的更多相关文章

  1. Yahoo Programming Contest 2019 E - Odd Subrectangles

    E - Odd Subrectangles 思路: 对于行方案固定的情况下,假设和为奇数的列为a个,和为偶数的列为b个,a+b = m 那么从奇数里面选奇数个,即C(a, 1) + C(a, 3) + ...

  2. [AtCoder] Yahoo Programming Contest 2019

    [AtCoder] Yahoo Programming Contest 2019   很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...

  3. Yahoo Programming Contest 2019 补题记录(DEF)

    D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...

  4. 【AtCoder】Yahoo Programming Contest 2019

    A - Anti-Adjacency K <= (N + 1) / 2 #include <bits/stdc++.h> #define fi first #define se se ...

  5. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  6. Yahoo Programming Contest 2019 F - Pass

    F - Pass 思路: dp[i][j] 表示到第 i 个球为止放了 j 个蓝球的方案数 第 i 个球来自的位置的最右边是min(i, n) 转移方程看代码 代码: #pragma GCC opti ...

  7. Yahoo Programming Contest 2019 D - Ears

    D - Ears 思路: s:起点           t:终点           l:左端点           r:右端点 以上称为关键点 dp[i][j]表示到位置 i 为止,已经经过前 j ...

  8. Yahoo Programming Contest 2019

    A - Anti-Adjacency 签. #include <bits/stdc++.h> using namespace std; int main() { int n, k; whi ...

  9. Yahoo Programming Contest 2019 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

随机推荐

  1. PyCharm+SVN

    首先电脑安装svn,并且确svn/bin下面有svn.exe文件 没有bin/svn.exe解决方法: 重新打开TortoiseSVN安装文件-Modify-Next后在command line cl ...

  2. JAVA 代码中使用中文的办法

    在编译代码中插入 -encoding UTF-8 示例: javac -encoding UTF-8 *.java

  3. paython3-练习

    在文本每行末尾加; f = open(r'D:\test1\1.txt','rb') w = open(r'D:\test1\2.txt','wb') for line in f.readlines( ...

  4. jqurey实现点赞特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 泛微云桥e-Bridge安装手册

    有时候不看官方文档进行配置,可能会出现奇奇怪怪的问题,SO转载一下官方文档,顺带学习. 想超长体验此软件,请搜索本博客内容,有破解方法,仅用来学习使用,顺带进行二次开发,请勿使用在商业用途,谢谢. 泛 ...

  6. PyOpenCV图像逆时针旋转90度

    warpAffine方法效果很搓,留下大片黑色区域. 使用flip和transpose可以实现逆时针旋转90度.先flip或先transpose均可. #coding:utf-8 import cv2 ...

  7. file /usr/share/mysql/charsets/README from install of MySQL-server-5.1.73-1.glibc23.i386 conflicts with file from package mysql-libs-5.1.73-8.el6_8.i686

    1:也许之前的机器安装过Mysql,但是自己不知道,账号密码也忘记了,又执行安装操作,导致Mysql不兼容问题.Linux上安装MySQL时出现不兼容的解决办法,错误如下所示: [root@maste ...

  8. C++ 复制构造函数 与 赋值运算符

    在C++中,将一个对象赋给另外一个对象,编译器将提供赋值运算符的定义. 有两种情况,下面假设catman是Monster的一个实例 第一种:初始化 Monster golblen= catman; 第 ...

  9. ES6中const、let与var的对比详解

    对比 声明方式 变量提升 作用域 初始值 重复定义const 否   块级 需要 不允许let   否     块级 不需要 不允许var 是    函数级 不需要 允许 变量提升:const 和 l ...

  10. (原创)C# 压缩解压那些事儿

    吐槽: 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗的太垃圾了,获取下来的压缩包使用正常方式无法解压!!没有专门的API ...