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.pswp.cn/news/394770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394770.shtml
英文地址,請注明出處:http://en.pswp.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…