BZOJ 1004 【HNOI2008】 Cards

news/2024/7/5 6:27:37

题目链接:Cards

  听说这道题是染色问题的入门题,于是就去学了一下\(Burnside\)引理和\(P\acute{o}lya\)定理(其实还是没有懂),回来写这道题。

  由于题目中保证"任意多次洗牌都可用这\(m\)种洗牌法中的一种代替",于是有了封闭性。

  结合律显然成立。

  题目中还保证了"对每种洗牌法,都存在一种洗牌法使得能回到原状态",逆元也有了。

  只剩下一个单位元,我们手动补上。单位元就是不洗牌。

  所以所有的洗牌方案构成了一个置换群。于是就可以用$Burnside$引理了。

  这道题由于颜色有数目限制,那么就不能直接上$P\acute{o}lya$定理了。

  根据$Burnside$引理,本质不同的染色数目$ans$就是$C(f)$的平均数。于是我们可以暴力算出$C(f)$,由于是在模意义下,所以除法变为逆元。

  当然,这里的暴力方法不是指指数级的枚举,而是$dp$。因为一种方案要在一个置换下本质不变,那么在同一个循环内的位置颜色必定相等。于是把所有循环都抠出来然后暴力三维背包就可以了。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define N 61

using namespace std;
typedef long long llg;

int Sr,Sb,Sg,m,p,ans;
int nt[N],siz[N],n,f[N][N][N];
bool vis[N];

void gi(int &x){if(x>=p) x%=p;}
int mi(int a,int b){
	int s=1;
	while(b){
		if(b&1) s=s*a,gi(s);
		a=a*a,gi(a); b>>=1;
	}
	return s;
}

int work(){
	int tol=0;
	for(int i=1;i<=n;i++) vis[i]=0;
	for(int i=1;i<=n;i++)
		if(!vis[i]){
			siz[++tol]=0;
			for(int j=i;!vis[j];j=nt[j]) vis[j]=1,siz[tol]++;
		}
	for(int r=0;r<=Sr;r++)
		for(int b=0;b<=Sb;b++)
			for(int g=0;g<=Sg;g++)
				f[r][b][g]=0;
	f[0][0][0]=1;
	for(int i=1;i<=tol;i++)
		for(int r=Sr;r>=0;r--)
			for(int b=Sb;b>=0;b--)
				for(int g=Sg;g>=0;g--){
					if(r>=siz[i]) f[r][b][g]+=f[r-siz[i]][b][g];
					if(b>=siz[i]) f[r][b][g]+=f[r][b-siz[i]][g];
					if(g>=siz[i]) f[r][b][g]+=f[r][b][g-siz[i]];
					gi(f[r][b][g]);
				}
	return f[Sr][Sb][Sg];
}

int main(){
	File("a");
	scanf("%d %d %d %d %d",&Sr,&Sb,&Sg,&m,&p);
	n=Sr+Sb+Sg;
	for(int i=1;i<=n;i++) nt[i]=i; ans=work();
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++) scanf("%d",&nt[j]);
		ans+=work(); gi(ans);
	}
	ans*=mi(m+1,p-2); gi(ans);
	printf("%d",ans);
	return 0;
}

转载于:https://www.cnblogs.com/lcf-2000/p/6233651.html


http://www.niftyadmin.cn/n/4308585.html

相关文章

.NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来。因为AForge.NET更注重与一些底层和广度&#xff0c;而Accord.NET Framework更注重与机器学习算法以及提供计算机视频、音频、信号处理以及统计应用相关的解决方案。该项目使用C#语言编写&#xff0c;项目…

Node.js 自学之旅(初稿篇)

学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里面看到一篇关于node编写的小爬虫 的文章,没想到这个可以做一些服务自己的东西而不是公司那些服务用户…

C语言 · 回文数 · 基础练习

问题描述1221是一个非常特殊的数&#xff0c;它从左边读和从右边读是一样的&#xff0c;编程求所有这样的四位十进制数。输出格式按从小到大的顺序输出满足条件的四位十进制数。代码如下&#xff1a;注意&#xff1a;这里要提醒一下读者&#xff1a;蓝桥杯都是在线提交&#xf…

python PIL比较图片像素

1 # -*- coding: utf-8 -*-2 3 from PIL import Image4 from pylab import *5 6 def compare_pic_L(pic1,pic2):7 #打开第一张图片8 im1 Image.open(pic1).convert(L)9 print im1.format ,im1.size, im1.mode 10 11 #像素值转数组 12 aim1 np.trans…

【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法...

若干年前读研的时候&#xff0c;学院有一个教授&#xff0c;专门做群蚁算法的&#xff0c;很厉害&#xff0c;偶尔了解了一点点。感觉也是生物智能的一个体现&#xff0c;和遗传算法、神经网络有异曲同工之妙。只不过当时没有实际需求学习&#xff0c;所以没去研究。最近有一个…

《DSP using MATLAB》示例Example6.1

今天是2016年最后一天了&#xff0c;看到其他博友都写年终总结&#xff0c;做了这个&#xff0c;做了那个&#xff0c;收获满满&#xff0c;再看看自己&#xff0c; 恍恍惚惚一年&#xff0c;不知道干了些什么&#xff0c;惭愧。刚才接到老妈远方的电话&#xff0c;弟弟就在一小…

【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

Maybe 这个问题很简单&#xff0c;因为解决方法是非常简单&#xff0c;但填坑过程会把人逼疯&#xff0c;在阿里云ONS工作人员、同事和朋友的协助下&#xff0c;经过一天的调试和瞎捣鼓&#xff0c;终于解决了这个坑&#xff0c;把问题记下来&#xff0c;也许更多人在碰到类似问…

Oracle的SCN与检查点机制

Oracle的SCN与检查点机制 SCN在Oracle的文档上以多种形式出现&#xff0c;一种是System Change Number&#xff0c;另一种是System Commit Number&#xff0c;在大多数情况下&#xff0c;Systems Change Numbers的定义更为确切。 SCN&#xff08;System Change Number&#xff…