CF662C Binary Table

题意:

给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\)

\(n\le 20, m\le 10^5\)

题解:

可以把每一列看作一个二进制数,这样得到\(m\)个二进制数,记为\(A\),翻转第\(i\)列就相当于把每个二进制数异或上\(1<<i\),由于\(n\)很小,所以枚举所有的翻转组合,一共\(2^n\)种,令\(d(x)\)表示最高位为\(n\)的二进制数中\(0\)和\(1\)数量的最大值,那么答案可以表示为:

\[\sum_{msk=0}^{2^n-1}(\sum_{i=1}^m d(msk\oplus A[i]))
\]

转化一下得到:

\[\sum_{msk=0}^{2^n-1}(\sum_{x\oplus y=msk} d(x) \times c(y))
\]

其中\(c(y)\)表示\(y\)出现的次数

接下来跑\(FWT\)就好了

view code
//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
const int MAXN = 2e6+7;
const int MOD = 998244353;
const int inv2 = (MOD + 1) / 2;
int n, m, A[MAXN], f[MAXN], N, c[MAXN]; void FWT_xor(int *a,int opt){
for(int i=1;i<N;i<<=1)
for(int p=i<<1,j=0;j<N;j+=p)
for(int k=0;k<i;++k){
int X=a[j+k],Y=a[i+j+k];
a[j+k]=(X+Y)%MOD;a[i+j+k]=(X+MOD-Y)%MOD;
if(opt==-1)a[j+k]=1ll*a[j+k]*inv2%MOD,a[i+j+k]=1ll*a[i+j+k]*inv2%MOD;
}
}
char buf[MAXN];
int main(){
scanf("%d %d",&n,&m);
for(int i = 0; i < n; i++){
scanf("%s",buf+1);
for(int j = 1; j <= m; j++) A[j] ^= ((buf[j]-'0')<<i);
}
N = 1 << n;
for(int i = 0; i < N; i++){
f[i] = __builtin_popcount(i);
f[i] = min(f[i],n-f[i]);
}
for(int i = 1; i <= m; i++) c[A[i]]++;
FWT_xor(f,1); FWT_xor(c,1);
for(int i = 0; i < N; i++) f[i] = 1ll * f[i] * c[i] % MOD;
FWT_xor(f,-1);
cout << *min_element(f,f+N) << endl;
return 0;
}

CF662C Binary Table【FWT】的更多相关文章

  1. CF662C Binary Table 【状压 + FWT】

    题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 ...

  2. CF662C Binary Table 枚举 FWT

    题面 洛谷题面 (虽然洛谷最近有点慢) 题解 观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转. 对于第i列,我们将它代表的01串提取出来,表示为\( ...

  3. CF662C Binary Table (FWT板题)

    复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=i​f[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ...

  4. [CF662C] Binary Table(FWT)

    题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:

  5. [CF662C Binary Table][状压+FWT]

    CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) ...

  6. 【CF662C】Binary Table(FWT)

    [CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...

  7. 606. Construct String from Binary Tree 【easy】

    606. Construct String from Binary Tree [easy] You need to construct a string consists of parenthesis ...

  8. 543. Diameter of Binary Tree【Easy】【二叉树的直径】

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  9. CF662C Binary Table FWT

    传送门 \(N \leq 20\)很小诶 一个暴力的思路是枚举行的翻转状态然后在列上贪心 复杂度为\(O(2^NM)\)显然过不去 考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策 ...

随机推荐

  1. PHP 打水印功能

    /** * @param $str 需要打水印的文字 * @param int $size 文字大小 * @param int $red 文字的颜色 rgb r * @param int $gree ...

  2. 使用uiautomatorviewer报错Error obtaining UI hierarchy

    现象:使用uiautomatorviewer报错Error obtaining UI hierarchy 解决方法:经验证关闭appium,再重新获取,就不会报错     (python运行了app代 ...

  3. (十二)random模块

    大致有以下几个函数: print(random.random()) #0到1的浮点型 print(random.randint(1,6)) #1到6的整型 print(random.randrange ...

  4. /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh: line 19: mysql: command not found

    [root@test ~]# tail -f /tmp/zabbix_agentd.log /var/lib/zabbix/percona/scripts/get_mysql_stats_wrappe ...

  5. Can't locate Time/HiRes.pm in @INC (@INC contains

    Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/ ...

  6. 基于Dockfile构建JAVA环境网站镜像

    查看本地目录 [root@docker tomcat]# ls apache-tomcat-8.5.16.tar.gz  Dockerfile  jdk-8u91-linux-x64.tar.gz   ...

  7. 鸿蒙的fetch请求加载聚合数据的前期准备工作-手动配置网络权限

    目录: 1.双击打开"config.json"文件 2.找到配置网络访问权限位置1 3.配置内容1 4.默认访问内容是空的 5.添加配置内容2 6.复制需要配置的网络二级URL 7 ...

  8. python中hmac模块的使用

    hmac(hex-based message authentication code)算法在计算哈希的过程中混入了key(实际上就是加盐),和hashlib模块中的普通加密算法相比,它能够防止密码被撞 ...

  9. [APUE] 进程环境

    APUE 一书的第七章学习笔记. 进程终止 有 8 种方式可以使得进程终止,5 种为正常方式: Return from main Calling exit() Calling _exit or _Ex ...

  10. ubuntu qt5.8 编译qtwebkit

    qtwebkit- 下载地址:http://download.qt.io/community_releases/5.8/5.8.0-final/ 问题一 出现如下错误 解决方法   sudo apt- ...