题意:一个$n\times m$的数表,数值$\in[0,4)$,你可以任意次选择一行或一列$+1,\text{mod }4$,要最小化所有数的和

因为$n\leq10$,所以数表可以看成$m$个$n$位$4$进制数$a_{1\cdots m}$,以下使用不进位加法

定义$f(x)=\min\limits_{i=0}^3\left(x+(i\cdots i)_4\right)$,如果确定了行的方案$s$,答案就是$\sum\limits_if(a_i+s)$

记$c_x$为$x$在$a_{1\cdots m}$中的出现次数,$\text{ans}(s)=\sum\limits_xc_xf(x+s)=\sum\limits_{a+b=s}c_{-a}f(b)$,是一个高维循环卷积

高维卷积需要用到高维FFT,根据wiki,只需在每一维分别dft即可,时间复杂度$O(n4^n)$

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=998244353,inf=2147483647;
int mul(int a,int b){return(ll)a*b%mod;}
int ad(int a,int b){return(a+=b)>=mod?a-mod:a;}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
int*w[5],iN;
void pre(){
	int i,j,t;
	for(i=2;i<=4;i<<=1){
		w[i]=new int[i+1];
		t=pow(3,(mod-1)/i);
		w[i][0]=1;
		for(j=1;j<=i;j++)w[i][j]=mul(w[i][j-1],t);
	}
	iN=pow(4,mod-2);
}
void dft4(int*a,int sh,int on){
	#define a(i) a[(i)<<sh]
	const int N=4;
	int i,j,k,t;
	swap(a(1),a(2));
	for(i=2;i<=N;i<<=1){
		for(j=0;j<N;j+=i){
			for(k=0;k<i>>1;k++){
				t=mul(a(i/2+j+k),w[i][on==1?k:i-k]);
				a(i/2+j+k)=ad(a(j+k),mod-t);
				a(j+k)=ad(a(j+k),t);
			}
		}
	}
	if(on==-1){
		for(i=0;i<N;i++)a(i)=mul(a(i),iN);
	}
	#undef a
}
int n,N;
void dft(int*a,int on){
	int i,j;
	for(j=0;j<n;j++){
		for(i=0;i<N;i++){
			if(!(i>>j*2&3))dft4(a+i,j*2,on);
		}
	}
}
int a[10010];
int c[1048576],f[1048576];
int t[4];
int main(){
	int m,i,j,x,res;
	scanf("%d%d",&n,&m);
	N=1<<n*2;
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			scanf("%d",&x);
			a[j]=a[j]<<2|x;
		}
	}
	for(i=1;i<=m;i++)c[a[i]]++;
	reverse(c,c+N);
	for(i=0;i<N;i++){
		t[0]=t[1]=t[2]=t[3]=0;
		for(j=0;j<n;j++)t[i>>j*2&3]++;
		f[i]=min(min(t[1]+2*t[2]+3*t[3],t[0]+2*t[1]+3*t[2]),min(t[3]+2*t[0]+3*t[1],t[2]+2*t[3]+3*t[0]));
	}
	pre();
	dft(c,1);
	dft(f,1);
	for(i=0;i<N;i++)c[i]=mul(c[i],f[i]);
	dft(c,-1);
	res=inf;
	for(i=0;i<N;i++)res=min(res,c[i]);
	printf("%d",res);
}

[xsy3132]数表的更多相关文章

  1. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  2. C++ 虚函数表解析

    转载:陈皓 http://blog.csdn.net/haoel 前言 C++中 的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实 ...

  3. n维数组实现(可变参数表的使用)

    首先先介绍一下可变参数表需要用到的宏: 头文件:#include<cstdarg> void va_start( va_list arg_ptr, prev_param ); type v ...

  4. C++ 多态、虚函数机制以及虚函数表

    1.非virtual函数,调用规则取决于对象的显式类型.例如 A* a  = new B(); a->display(); 调用的就是A类中定义的display().和对象本体是B无关系. 2. ...

  5. C++迟后联编和虚函数表

    先看一个题目: class Base { public: virtual void Show(int x) { cout << "In Base class, int x = & ...

  6. C++ 知道虚函数表的存在

    今天翻看陈皓大大的博客,直接找关于C++的东东,看到了虚函数表的内容,找一些能看得懂的地方记下笔记. 0 引子 类中存在虚函数,就会存在虚函数表,在vs2015的实现中,它存在于类的头部. 假设有如下 ...

  7. C++虚函数和虚函数表

    前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: #include <iostream> ...

  8. C++ Daily 《5》----虚函数表的共享问题

    问题: 包含一个以上虚函数的 class B, 它所定义的 对象是否共用一个虚函数表? 分析: 由于含有虚函数,因此对象内存包含了一个指向虚函数表的指针,但是这个指针指向的是同一个虚函数表吗? 实验如 ...

  9. C++虚函数表

    大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...

随机推荐

  1. python基础知识字符串与元祖

    https://blog.csdn.net/hahaha_yan/article/details/78905495 一.字符串的类型 ##表示字符串: 'i like the world' " ...

  2. UI系统的作用

    1.向用户展示信息: 2.将用于与系统的交互解释为指令.

  3. Frightful Formula Gym - 101480F (待定系数法)

    Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...

  4. GitHub上如何创建文件夹

    看了网上很多关于如何在git上创建空文件夹的文章后,发现大家写的都是用指令在本地创建一个空文件夹后再上传指令和步骤都太繁琐且复杂了,对于用git不是很熟练得到人来说太麻烦了,而且在本地于github上 ...

  5. 洛谷 P1099 树网的核+P2491 [SDOI2011]消防

    写在前面:由于是双倍经验就放一块了,虽然数据范围差的有点大. 题目链接 题意:在树的直径上选择一条长度不超过s的路径使这条路径上的点到树上任意点的最大距离最小. 这题数据好像非常水,我写了上界n^2不 ...

  6. nginx 配置ssl

    单向SSL配置实例: server{ listen ssl; server_name www..com; root /data/wwwroot/www..com/ ; index index.html ...

  7. Golang 接口

    1 接口是什么 Golang中没有像Python.Java拥有类和对象的概念,其封装对象或说明对象是通过接口来实现的.比如谁能够实现什么样的功能,便能够将其抽象化封装. 接口定义了一组方法(抽象方法集 ...

  8. ARC098F Donation

    传送门 Atcoder Solution 首先是几个引理: 重新定义权值\(val_i=max(a_i-b_i,0)\),那么通过这个点必须需要\(val_i+b_i\)的钱. 多次经过一个点一定是在 ...

  9. 在Visual Studio中直接编译Fluent的UDF(修正)

    原文见:http://blog.sina.com.cn/s/blog_14d64daa10102xkg4.html 主要是修正几个问题: 首先是头文件填入的顺序需要严格按照我前文给出的顺序填写,否则可 ...

  10. jmeter压力测试中的疑难杂症

    概述 大部分新手在用jmeter做压力测试的时候,对一些性能术语十分模糊,直接导致的后果就是对测试出来的结果数据根本不能理解,更谈不上分析了.今天的文章就着重给大家解释一下压力测试中的一些专有名词 问 ...