bzoj1004: [HNOI2008]Cards(burnside引理+DP)
题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数。
置换群的burnside引理,还有个Pólya过几天再看看。。。
burnside引理:有m个置换k种颜色,所有本质不同的染色方案数就是每种置换的不变元素的个数的平均数。
求每种置换的不变元素的个数用背包解决。因为置换之后元素不变,所以对于每个循环节我们要染一个颜色,于是先处理出循环节作为背包中的“物体”,然后一个三维背包解决。f[i][j][k]的i j k表示三种颜色分别还可以染多少次。
除m%p用费马小定理就行了,我才不用exGCD...(QAQ因为老是忘记怎么写,快速幂多资磁
没清零WA了2次。。。最近老是出小问题
UPD:去看了一波polya定理,例题poj2409中,一开始我不理解为什么旋转1次和旋转2次要当做2个置换,看了群的概念才知道呜呜呜.... 
封闭性就是指连续运算得到的结果也在群里面,所以旋转1次和旋转2次要当做两个置换。
但是回到这题,为什么不用将任意一个置换再生成新的置换再计算呢?原来...

“输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替”就满足了置换群的定义,多次洗牌->连续运算,可用一种代替 说明这连续运算的结果也算是一种置换。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
void read(ll &k)
{
k=;int f=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
ll sr,sb,sg,m,p,n,ans;
ll next[],a[][],d[],f[][][][];
ll dp(int x)
{
int cnt=;
for(int i=;i<=n;i++)next[i]=;
for(int i=;i<=n;i++)
if(!next[i])
{
d[++cnt]=next[i]=;
int p=i;
while(!next[a[x][p]])
{
p=a[x][p];
next[p]=;
d[cnt]++;
}
}
for(int i=;i<=sr;i++)
for(int j=;j<=sb;j++)
for(int k=;k<=sg;k++)
f[][i][j][k]=f[][i][j][k]=;
f[][][][]=;
int now=;
for(int l=;l<=cnt;l++)
{
for(int i=;i<=sr;i++)
for(int j=;j<=sb;j++)
for(int k=;k<=sg;k++)
{
if(i>=d[l])f[now][i][j][k]=(f[now^][i-d[l]][j][k]+f[now][i][j][k])%p;
if(j>=d[l])f[now][i][j][k]=(f[now^][i][j-d[l]][k]+f[now][i][j][k])%p;
if(k>=d[l])f[now][i][j][k]=(f[now^][i][j][k-d[l]]+f[now][i][j][k])%p;
}
now^=;
}
return f[now^][sr][sb][sg];
}
ll mi(ll a,int b)
{
ll t=,y=a;
while(b)
{
if(b&)t=(t*y)%p;
y=(y*y)%p;
b>>=;
}
return t%p;
}
int main()
{
read(sr);read(sb);read(sg);read(m);read(p);n=sr+sb+sg;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
read(a[i][j]);
m++;
for(int i=;i<=n;i++)a[m][i]=i;
for(int i=;i<=m;i++)
ans=(ans+dp(i))%p;
printf("%lld\n",ans*mi(m,p-)%p);
}
bzoj1004: [HNOI2008]Cards(burnside引理+DP)的更多相关文章
- BZOJ1004: [HNOI2008]Cards(Burnside引理 背包dp)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4255 Solved: 2582[Submit][Status][Discuss] Descript ...
- bzoj1004 [HNOI2008]Cards Burnside 引理+背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1004 题解 直接 Burnside 引理就可以了. 要计算不动点的个数,那么对于一个长度为 \ ...
- 【bzoj1004】[HNOI2008]Cards Burnside引理+背包dp
题目描述 用三种颜色染一个长度为 $n=Sr+Sb+Sg$ 序列,要求三种颜色分别有 $Sr,Sb,Sg$ 个.给出 $m$ 个置换,保证这 $m$ 个置换和置换 ${1,2,3,...,n\choo ...
- 【BZOJ1004】[HNOI2008]Cards Burnside引理
[BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...
- luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点
LINK:Cards 不太会burnside引理 而这道题则是一个应用. 首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换. burnside引理: 其中D( ...
- BZOJ 1004 HNOI2008 Cards Burnside引理
标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...
- BZOJ1004 HNOI2008 Cards Burnside、背包
传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...
- BZOJ 1004 Cards(Burnside引理+DP)
因为有着色数的限制,故使用Burnside引理. 添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数, 每个循环节的长度. 则ans=sigma(f(i))/(m+1) % ...
- [BZOJ1004][HNOI2008]Cards 群论+置换群+DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. ...
随机推荐
- 什么是Spark
什么是Spark Apache Spark是一个开源集群运算框架, 相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中,Spark使用了存储器内运算技术,能在数据尚未写入硬盘 ...
- Ubuntu—查看进程并关闭进程
环境:Ubuntu终端 命令:ps -aux 功能:查看进程信息 命令:kill 进程号(PID) 功能:杀死进程
- fp-growth树创建代码及详细注释
事务集过滤重排: #FP树节点结构 class treeNode: def __init__(self,nameValue,numOccur,parentNode): self.name=nameVa ...
- Turtlebot
Turtlebot2 数据分析: imu信息:只有z轴的旋转yaw,没有xy的角速度. odom:利用轮速计,提供平移变换,没有z方向的平移. 好的网站,详细介绍了turtlebot的使用:https ...
- springmvc项目,浏览器报404错误的问题
问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...
- [Data Structures and Algorithms - 1] Introduction & Mathematics
References: 1. Stanford University CS97SI by Jaehyun Park 2. Introduction to Algorithms 3. Kuangbin' ...
- openstack对接VMware浅析
前言 本文是对openstack对接vmware的浅析,所以本文重点是以下两点: 先了解它的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互 ...
- 6.hdfs的存储过程
1.hdfs 怎么存储 切割存储 2. 为何每块是128m 与io读写速度有关,一般人的接受速度1s中,而磁盘的读写速度为100m/s,在读取文件时候需要硬盘寻找地址,一般读懂速度和寻找之间的比例是1 ...
- HDU 2489 Minimal Ratio Tree(暴力+最小生成树)(2008 Asia Regional Beijing)
Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated accord ...
- Pipeline组Beta版本发布说明
项目名称 Pipeline 项目版本 Beta版本 负责人 北京航空航天大学计算机学院 IloveSE 小组 联系方式 http://www.cnblogs.com/IloveSE 要求发布日期 20 ...