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是一个集合,*是定义在这个集合上的一个运算. ...
随机推荐
- 初学Direct X(3)
初学Direct X(3) 1.获取外设输入--键盘以及鼠标 无论是获取鼠标还是键盘的设备,首先得初始化DirectInput,不过先把必要的环境先配置好: 所要用到的头文件以及库文件是(相比于前两次 ...
- 一步一步图文介绍SpriteKit使用TexturePacker导出的纹理集Altas
1.为什么要使用纹理集? 游戏是一种很耗费资源的应用,特别是在移动设备中的游戏,性能优化是非常重要的 纹理集是将多张小图合成一张大图,使用纹理集有以下优点: 1.减少内存占用,减少磁盘占用: 2.减少 ...
- C if 判断 else 否则
#include <stdio.h> int main(int argc, char **argv) { //新建三个变量进行比较 int a,b,c; //输入三个变量的值scanf(& ...
- 【input】输入框组件说明
input输入框组件 原型: <input value="[String]" type="[text | number | idcard | digit]" ...
- GIT: 分布式开发 代码管理工具使用命令大全
代码管理工具: GIT 什么是GIT? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
- [HNOI2017]影魔
题意: 给定 \(n\) 个数的排列,\(m\) 次询问,每次询问询问一个区间内所有子区间的贡献. 每个区间如果两个端点分别是最大值和次大值,我们就算 \(P1\) 的贡献. 如果两个端点一个是最大值 ...
- vim—自动缩进(编写Python脚本)
大神推荐使用vim编写Python脚本,学而时积之,不亦乐乎! 使用vim编写Python脚本的时候不能正常缩进,需要修改vimrc文件 Ubuntu系统下vimrc文件的位置: $ cd /etc/ ...
- 小米 OJ 编程比赛 02 月常规赛
Carryon 数数字 描述 Carryon 最近迷上了数数字,然后 Starry 给了他一个区间[l,r] ,然后提了几个要求, 需要将 ll 到 rr 之间的数全部转化成 16 进制,然后连起来. ...
- LeetCode 107 ——二叉树的层次遍历 II
1. 题目 2. 解答 与 LeetCode 102 --二叉树的层次遍历 类似,我们只需要将每一层的数据倒序输出即可. 定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level ...
- 为什么请求时,需要使用URLEncode做encode转码操作(转)
什么要对url进行encode 发现现在几乎所有的网站都对url中的汉字和特殊的字符,进行了urlencode操作,也就是: http://hi.baidu.com/%BE%B2%D0%C4%C0%C ...