「CF662C」 Binary Table
2024-10-03 19:40:30
「CF662C」 Binary Table
题目所给的 \(n\) 很小,于是我们可以考虑这样一种朴素做法:暴力枚举第 \(i\) 行是否翻转,这样每一行的状态就确定了,这时取每一列 \(0/1\) 个数较小的数字即可(因为每一列也可以翻转)。这样的时间复杂度是 \(O(m\cdot2^n)\)。
但是显然这样过不了。
我们发现表格的具体行列对我们的答案是没有影响的。即我们只需要知道状态为 \(x\) 的行或者状态为 \(x\) 的列的个数即可。由于 \(n\le20\),这启发我们对于每一列进行状态压缩。
于是我们定义:\(f_S\) 表示列状态为 \(S\) 的列的个数,同时定义 \(g_S\) 为 列状态为 \(S\) 的列中 \(0/1\) 个数中小的一个。显然 \(f,g\) 两个数组都可以在可以接受的时间范围内预处理出来。
对于翻转情况,我们用一个数 \(x\) 表示,若二进制下第 \(i\) 位为 \(1\), 则代表第 \(i\) 行翻转。
于是有当翻转状态为 \(x\) 时,有
\[Ans_x=\sum_{i=0}^{2^n-1}f_ig_{i\oplus x}
\]
\]
其中 \(\oplus\) 代表按位异或。
简单变形,我们可以得到
\[Ans_x=\sum_{i=0}^{2^n-1}\sum_{j=0}^{2^n-1}[i\oplus x=j]f_ig_j
\]
\]
由于异或具有交换律,于是有
\[Ans_x=\sum_{i=0}^{2^n-1}\sum_{j=0}^{2^n-1}[i\oplus j=x]f_ig_j
\]
\]
这就是集合幂卷积中异或卷积的标准形式,直接使用 \(\texttt{FWT}\) 优化计算即可。时间复杂度为 \(O(n2^n)\)。
代码很简洁,如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;
long long num[maxn],f[maxn],g[maxn];
int n,m;
inline void XOR(long long *f,int tmp){
for(int o=2,k=1;o<=n;o<<=1,k<<=1){
for(int i=0;i<n;i+=o){
for(int j=0;j<k;++j){
long long a=f[i+j],b=f[i+j+k];
if(tmp) f[i+j]=a+b,f[i+j+k]=a-b;
else f[i+j]=(a+b)>>1,f[i+j+k]=(a-b)>>1;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int x;scanf("%1d",&x);
num[j]+=x*(1<<i-1);
}
}
for(int i=1;i<=m;++i) ++f[num[i]];
for(int i=1;i<(1<<n);++i){
int x=i;
while(x) x=(x-1)&x,++g[i];
g[i]=min(g[i],n-g[i]);
}
n=(1<<n);
XOR(f,1),XOR(g,1);
for(int i=0;i<n;++i) f[i]=f[i]*g[i];
XOR(f,0);
long long ans=(1<<30);
for(int i=0;i<n;++i) ans=min(ans,f[i]);
printf("%lld\n",ans);
return 0;
}
最新文章
- iOS XCode7制作.Framework动态库和.a静态库的总结
- Unity3D 事件
- ffmpeg-20160517-git-bin-v2
- 简单的session共享的封装
- HDU 2577---How to Type
- oracle和sql server的区别(1)
- vim配置python开发环境
- algorithm@ Matrix fast power
- Java基础知识强化之IO流笔记38:字符流缓冲流之BufferedWriter / BufferedReader使用
- javascript 字符串转数字
- 使用jenkins + python + selenium一步步搭建web自动化测试“框架”(1) - 各部件简介
- HDOJ 1715 大菲波数
- 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller
- 破解MyEclipse2013注册码
- linux 下 tomcat 之 配置静态资源路径
- Ognl值栈对象及struts标签
- Java异常类(Throwable)
- 用JavaScript写一个区块链
- 《用Python做HTTP接口测试》练习资料共享
- Core知识整理
热门文章
- 通过CSS设计模式搭建自己系统的CSS架构
- ADAS可行驶区域道路积水反光区域的识别算法
- TcaplusDB祝大家端午安康!
- GD32F330 | ADC实例 基于DMA方式
- java线程和操作系统线程的异同(大图对比)
- [Linux]经典面试题 - 网络基础 - TCP三次握手
- 32.qt quick-模仿QQ登录界面实现3D旋转(Rotation、Flipable)
- 【Linux进阶】使用grep、find、sed以及awk进行文本操作
- 【.NET 与树莓派】TM1638 模块的按键扫描
- .NetCore使用Docker安装ElasticSearch、Kibana 记录日志