CF662C Binary Table(FWT)

[Luogu-CF662C]

FWT_xor

题目描述

有一个 \(n\)\(m\) 列的表格,每个元素都是 $0/1 $,每次操作可以选择一行或一列,把 \(0/1\) 翻转,即把 \(0\) 换为 \(1\) ,把 \(1\) 换为 \(0\) 。请问经过若干次操作后,表格中最少有多少个 \(1\)

首先可以想到\(O(2^N*M)\)的暴力,即枚举每一行是否翻转,然后\(O(M)\)计算

\(f_k\)表示选择了状态为\(k\)的那些行,\(a_i\)表示有多少列的二进制表示等于\(i\)\(b_j\)表示\(j\)\(0\)个数和\(1\)个数的较小值,

我们有\(f_k=∑_{i⊗k=j}{a_i}{b_j}\),这相当于枚举对哪些行进行操作(\(k\)),然后对于二进制表示为\(i\)的列(有\(a_i\)列,做完行变换后这一列的值为\(i⊗k\)),贪心(\(b_j\))地选择是否对这一列做变换,用异或的性质把\(j,k\)互换,我们得到\(f_k=∑_{i⊗j=k}{a_i}{b_j}\),这是一个卷积的形式,可以用FWT快速求得答案

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){register LL x=0,f=1;register char c=getchar();while(c<48||c>57){if(c=='-')f=-1;c=getchar();}while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();return f*x;
}const int N=20;
const int MAXN=1<<N;
const int MAXM=1e5+5;LL a[MAXN],b[MAXN];
char s[N][MAXM];
int n,m,len;inline void FWT(LL *A,int type){for(int i=1;i<len;i<<=1)for(int j=0;j<len;j+=(i<<1))for(int k=0;k<i;k++){LL x=A[j+k],y=A[j+i+k];A[j+k]=x+y,A[j+i+k]=x-y;if(type==-1) A[j+k]/=2,A[j+i+k]/=2;}
}int main(){n=read(),m=read();len=1<<n;for(int i=1;i<=n;i++) scanf("%s",s[i]+1);for(int i=1;i<=m;i++){int x=0;for(int j=1;j<=n;j++) x=(x<<1)+s[j][i]-'0';a[x]++;}for(int i=0;i<len;i++) b[i]=b[i>>1]+(i&1);for(int i=0;i<len;i++) b[i]=min(b[i],n-b[i]);FWT(a,1);FWT(b,1);for(int i=0;i<len;i++) a[i]*=b[i];FWT(a,-1);LL ans=a[0];for(int i=1;i<len;i++) ans=min(ans,a[i]);printf("%lld\n",ans);
}

转载于:https://www.cnblogs.com/lizehon/p/10546144.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言fmin最小公倍数,matlab小函数

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;(记得按字母序索引)矩阵向量化操作A(:)拉成一个向量 ($a_{11},a_{21},…$)&#xff0c;注意先列后行repmat用途&#xff1a;创建由小型矩阵重复组合成的矩阵&#…

spring管理的类如何调用非spring管理的类

spring管理的类如何调用非spring管理的类. 就是使用一个spring提供的感知概念,在容器启动的时候,注入上下文即可. 下面是一个工具类. 1 import org.springframework.beans.BeansException;2 import org.springframework.context.ApplicationContext;3 import org.springframewo…

django构建网页_如何使用Django构建照片供稿

django构建网页by Ogundipe Samuel由Ogundipe Samuel 如何使用Django构建照片供稿 (How to build a photo feed using Django) Today, we will make a real-time photo feed framework using Django and Pusher. This is like a mini Instagram, but without the comments and…

报表系统的雄心

这周有朋自远方来&#xff0c;聊了对报表工具的看法&#xff0c;因此专门写篇文章来谈谈报表系统的未来。 笔者知道不可能有十全十美的报表系统&#xff0c;毕竟任何一个行业和企业受自身客观环境的限制&#xff0c;但表哥嘛&#xff0c;总要有点理想和追求&#xff0c;就好比到…

02----mockjs基本使用

一.mockjs基本使用 1.安装mockjs cnpm install mockjs --save-dev2.新建mockjs文件夹/index.js // 引入 Mock var Mock require(mockjs)// 定义数据类型 var data Mock.mock({// 20条数据"data|20": [{// 商品种类"goodsClass": "女装",// 商品…

vuefullcalendar怎么判断切换上下月_房间太多、楼上楼下,终极解决家里wifi信号无缝切换问题...

相信不少人有我一样的烦恼&#xff0c;房间太多&#xff0c;或者楼上楼下&#xff0c;家里的wifi信号总是不能无缝切换。路由器放在配电箱&#xff0c;除了客厅信号不错外&#xff0c;一旦到了其他房间&#xff0c;掉线、网速慢等问题让人很苦恼。特别是和小伙伴一起玩游戏一边…

C语言程序顺序结构1交换变量,如何将c语言中结构体内的所有类型变量的值输出来...

教了多年《C程序设计》课程&#xff0c;大多学生觉的这门课程难学。其实&#xff0c;按照我们现在的教学大纲和教学要求&#xff0c;只要同学们掌握一些方法&#xff0c;克服心理上畏难、不轻言放弃&#xff0c;是完全可以学好的。《C 程序设计》的内容很丰富&#xff0c;按照我…

尼古拉斯 android_圣尼古拉斯和Alexa的访问

尼古拉斯 android祝大家圣诞节快乐&#xff0c;并祝大家晚安&#xff01; (Happy Christmas to all, and to all a good night!) Inspired by the holiday season, emerging voice-first technology, and too much eggnog — I’ve twisted the classic poem from Clement Clar…

github 进阶说明

目录 github 进阶说明前言三个目录树重置 git reset增加路径的reset检出 checkout带路径的checkout仓库数据对象其他资料github 进阶说明 前言 我们可以什么都不管&#xff0c;照搬命令来完成我们大部分git工作&#xff0c;但是如果想要进一步&#xff0c;就要深入理解git的实现…

手把手教你 Spark 性能调优

0、背景 集群部分 spark 任务执行很慢&#xff0c;且经常出错&#xff0c;参数改来改去怎么都无法优化其性能和解决频繁随机报错的问题。 看了下任务的历史运行情况&#xff0c;平均时间 3h 左右&#xff0c;而且极其不稳定&#xff0c;偶尔还会报错&#xff1a; 1、优化思路 任…

pytorch线性回归代码_[PyTorch 学习笔记] 1.3 张量操作与线性回归

本章代码&#xff1a;https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/linear_regression.py张量的操作拼接torch.cat()torch.cat(tensors, dim0, outNone)功能&#xff1a;将张量按照 dim 维度进行拼接tensors: 张量序列dim: 要拼接的维度代码示例&#…

软考考前冲刺第十三章UML建模

1.如果一个对象发送了一个同步消息&#xff0c;那么它要等待对方对消息的应答&#xff0c;收到应答后才能继续自己的操作。而发送异步消息的对象不需要等待对方对消息的应答便可以继续自己的操作。 2.部署图描述了一个运行时的硬件结点&#xff0c;以及在这些结点上运行的软件组…

sqlalchemy_SQLAlchemy使ETL变得异常简单

sqlalchemyOne of the key aspects of any data science workflow is the sourcing, cleaning, and storing of raw data in a form that can be used upstream. This process is commonly referred to as “Extract-Transform-Load,” or ETL for short.任何数据科学工作流程的…

c语言枚举代替双switch,C语言 使用数组代替switch分支语句降低圈复杂度

#include typedef int(*CALCULATE_FUN)(int, int); //定义函数指针typedef struct tagStruct{CALCULATE_FUN fun_name; //结构体成员&#xff0c;存放函数char calc_flag; //结构体成员&#xff0c;存放符号}CALC_STRUCT;/* 加减乘除函数声明 */int fun_add(int x, int y);int …

基础DP(初级版)

本文主要内容为基础DP&#xff0c;内容来源为《算法导论》&#xff0c;总结不易&#xff0c;转载请注明出处。 后续会更新出kuanbin关于基础DP的题目...... 动态规划&#xff1a; 动态规划用于子问题重叠的情况&#xff0c;即不同的子问题具有相同的公共子子问题&#xff0c;在…

《UNIXLinux程序设计教程》一2.1 UNIX 输入输出基本概念

2.1 UNIX 输入输出基本概念 在任何一种操作系统中&#xff0c;程序开始读写一个文件的内容之前&#xff0c;必须首先在程序与文件之间建立连接或通信通道&#xff0c;这一过程称为打开文件。打开一个文件的目的可能是要读其中的数据&#xff0c;也可能是要往其中写入数据&…

python时间计算_日期天数差计算(Python)

描述 从json文件中读取两个时间数据&#xff08;数据格式例如&#xff1a;2019.01.01&#xff0c;数据类型是字符串&#xff09;&#xff0c;并计算结果&#xff0c;打印出两个时间间隔了多少天。 输入/输出描述 输入描述 json文件名称datetime.json&#xff0c;格式如下&#…

c语言编常见算法,5个常见C语言算法

5个常见C语言算法十进制转换为二进制的递归程序字符串逆置的递归程序整数数位反序&#xff0c;例如12345->54321四舍五入程序(考虑正负数)二分法查找的递归函数#include#include#include//十进制转换为二进制的递归程序voidDecimalToBinary(int n){if(n<0){printf("…

利用Kinect将投影变得可直接用手操控

Finally 总算是到了这一天了&#xff01;假期里算法想不出来&#xff0c;或者被BUG折磨得死去活来的时候&#xff0c;总是YY着什么时候能心情愉快地坐在电脑前写一篇项目总结&#xff0c;今天总算是抽出时间来总结一下这神奇的几个月。 现在回过头来看&#xff0c;上学期退出AC…

my-medium.cnf_您的手机如何打开medium.com-我将让门卫和图书管理员解释。

my-medium.cnfby Andrea Zanin由Andrea Zanin 您的手机如何打开medium.com-我将让门卫和图书管理员解释。 (How your phone opens medium.com — I’ll let a doorman and a librarian explain.) Hey did you notice what just happened? You clicked a link, and now here y…