题目链接


\(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. bzoj2973转移矩阵构造法!

    /* 构造单位矩阵(转移矩阵) 给定n*m网格,每个格子独立按照长度不超过6的操作串循环操作 对应的操作有 0-9:拿x个石头到这个格子 nwse:把这个格子的石头推移到相邻格子 d:清空该格石子 开 ...

  2. 拓展中国剩余定理(ex_crt)

    一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...

  3. 10进制 VS 2进制

    10进制 VS 2进制 时间限制: 1 Sec  内存限制: 32 MB 题目描述 样例输出 623 #include<stdio.h> #include<string.h> ...

  4. C++ Primer 笔记——lambda表达式

    1.一个lambda表达式表示一个可调用的代码单元,可以理解为一个未命名的内联函数,但是与函数不同,lambda表达式可能定义在函数内部.其形式如下: [capture list] (paramete ...

  5. MVC开发中的常见错误-02-在应用程序配置文件中找不到名为“OAEntities”的连接字符串。

    在应用程序配置文件中找不到名为“OAEntities”的连接字符串. 分析原因:由于Model类是数据库实体模型,通过从数据库中引用的方式添加实体,所以会自动产生一个数据库连接字符串,而程序运行到此, ...

  6. html5页面调用手机打电话功能

    <head>里面加上:<meta name="format-detection" content="telephone=yes"/> 需 ...

  7. Python深度学习案例1--电影评论分类(二分类问题)

    我觉得把课本上的案例先自己抄一遍,然后将书看一遍.最后再写一篇博客记录自己所学过程的感悟.虽然与课本有很多相似之处.但自己写一遍感悟会更深 电影评论分类(二分类问题) 本节使用的是IMDB数据集,使用 ...

  8. 隐藏WIN10资源管理器中的3D对象文件夹

    1.WIN+R,打开运行窗口,输入“regdeit”启动注册表编辑器 2.定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersio ...

  9. java解析html的table

    import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org. ...

  10. nginx配置http和https共存

    server { listen ; listen ssl; server_name localhost; #ssl on; ssl_certificate /usr/local/Tengine/ssl ...