Yahoo Programming Contest 2019.E.Odd Subrectangles(思路 线性基)
\(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(思路 线性基)的更多相关文章
- Yahoo Programming Contest 2019 E - Odd Subrectangles
		
E - Odd Subrectangles 思路: 对于行方案固定的情况下,假设和为奇数的列为a个,和为偶数的列为b个,a+b = m 那么从奇数里面选奇数个,即C(a, 1) + C(a, 3) + ...
 - [AtCoder] Yahoo Programming Contest 2019
		
[AtCoder] Yahoo Programming Contest 2019 很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...
 - Yahoo Programming Contest 2019 补题记录(DEF)
		
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
 - 【AtCoder】Yahoo Programming Contest 2019
		
A - Anti-Adjacency K <= (N + 1) / 2 #include <bits/stdc++.h> #define fi first #define se se ...
 - 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 ...
 - Yahoo Programming Contest 2019 F - Pass
		
F - Pass 思路: dp[i][j] 表示到第 i 个球为止放了 j 个蓝球的方案数 第 i 个球来自的位置的最右边是min(i, n) 转移方程看代码 代码: #pragma GCC opti ...
 - Yahoo Programming Contest 2019 D - Ears
		
D - Ears 思路: s:起点 t:终点 l:左端点 r:右端点 以上称为关键点 dp[i][j]表示到位置 i 为止,已经经过前 j ...
 - Yahoo Programming Contest 2019
		
A - Anti-Adjacency 签. #include <bits/stdc++.h> using namespace std; int main() { int n, k; whi ...
 - Yahoo Programming Contest 2019 自闭记
		
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
 
随机推荐
- C++ Primer 笔记——拷贝控制
			
1.如果构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是引用类型(否则会无限循环的调用拷贝构造函数). 2.如果没有为一个类 ...
 - Spring Cloud  Eureka简介及原理
			
Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务 ...
 - POJ 2001 Shortest Prefixes(字典树活用)
			
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21651 Accepted: 927 ...
 - net core 使用 rabbitmq
			
windows环境安装: https://www.cnblogs.com/ericli-ericli/p/5902270.html .NET Core 使用RabbitMQ https://www.c ...
 - springcloud feign传输List的坑
			
无法直接传输List 错误方法1: @RequestMapping(value = "/stat/merchant/get_merchant_compare_info", meth ...
 - [转]搭建Hadoop伪分布式环境
			
https://my.oschina.net/MyHeaven1987/blog/1821509 http://hadoop.apache.org/docs/current/hadoop-projec ...
 - ReactNative调试技术-真机调试
			
在我开始用ReactNative开始开发APP时,为了能够获取程序运行中的信息,就需要搭建调试环境. 手机调试方式有两类,一类是模拟器方式,另一类是真机模式. 我测试了一下相应的模拟器: 如果用谷歌管 ...
 - train_test_split数据切分
			
train_test_split 数据切分 格式: X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_d ...
 - 前端接口自动化测试工具-DOClever使用介绍(转载)
			
DOClever 不仅集成了文档编写,团队协作,接口运行,mock 数据等功能,还有两个功能是让我们团队大大的提高工作效率的.一个是接口的自动化生成,可以根据接口数据自动生成文档信息,还有一个便是本文 ...
 - SPOJ LCS - Longest Common Substring 字符串 SAM
			
原文链接http://www.cnblogs.com/zhouzhendong/p/8982392.html 题目传送门 - SPOJ LCS 题意 求两个字符串的最长公共连续子串长度. 字符串长$\ ...