【BZOJ1004】[HNOI2008]Cards

题意:把$n$张牌染成$a,b,c$,3种颜色。其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$。并且给出$m$个置换,保证这$m$个置换加上本身的置换能构成一个置换群,两种染色方案被认为是相同的当且仅当一种方案可以通过某个置换变成另一种。求不同的染色方案数。答案对$P$取模。

$sa,sb,sc\le 20,m\le 60$

题解:这里对每种颜色都有一个限制,怎么办呢?

回顾从Burnside引理到Pólya定理的推导过程。

如果一个染色方案是不动点,那么它的每个循环中的所有元素的颜色都相同。

所以对于一个置换$f$,我们找到它的一个循环,大小为$k$,我们可以将其看成一个大小为$k$的物品,然后跑多维背包求出方案数,即为不动点的数目。

最后套用Burnside引理即可。

#include <cstdio>
#include <cstring>
#include <iostream>
int n,m,sa,sb,sc,P;
int ans,f[21][21];
int vis[61],to[61];
inline int solve()
{
memset(f,0,sizeof(f)),memset(vis,0,sizeof(vis));
int i,j,a,b,t;
f[0][0]=1;
for(i=1;i<=n;i++) if(!vis[i])
{
for(t=0,j=i;!vis[j];vis[j]=1,j=to[j],t++);
for(a=sa;a>=0;a--) for(b=sb;b>=0;b--)
{
if(a>=t) f[a][b]+=f[a-t][b];
if(b>=t) f[a][b]+=f[a][b-t];
f[a][b]%=P;
}
}
return f[sa][sb];
}
inline int pw(int x,int y)
{
int z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
int main()
{
scanf("%d%d%d%d%d",&sa,&sb,&sc,&m,&P),n=sa+sb+sc;
int i,j;
for(j=1;j<=m;j++)
{
for(i=1;i<=n;i++) scanf("%d",&to[i]);
ans+=solve();
}
for(i=1;i<=n;i++) to[i]=i;
ans+=solve();
printf("%d",ans*pw(m+1,P-2)%P);
return 0;
}

【BZOJ1004】[HNOI2008]Cards Burnside引理的更多相关文章

  1. bzoj1004: [HNOI2008]Cards(burnside引理+DP)

    题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...

  2. BZOJ1004: [HNOI2008]Cards(Burnside引理 背包dp)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4255  Solved: 2582[Submit][Status][Discuss] Descript ...

  3. bzoj1004 [HNOI2008]Cards Burnside 引理+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1004 题解 直接 Burnside 引理就可以了. 要计算不动点的个数,那么对于一个长度为 \ ...

  4. 【bzoj1004】[HNOI2008]Cards Burnside引理+背包dp

    题目描述 用三种颜色染一个长度为 $n=Sr+Sb+Sg$ 序列,要求三种颜色分别有 $Sr,Sb,Sg$ 个.给出 $m$ 个置换,保证这 $m$ 个置换和置换 ${1,2,3,...,n\choo ...

  5. luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点

    LINK:Cards 不太会burnside引理 而这道题则是一个应用. 首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换. burnside引理: 其中D( ...

  6. BZOJ 1004 HNOI2008 Cards Burnside引理

    标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...

  7. BZOJ1004 HNOI2008 Cards Burnside、背包

    传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...

  8. bzoj1004 [HNOI2008]Cards Burnside定理+背包

    题目传送门 思路:首先是Burnside引理,要先学会这个博客. Burnside引理我们总结一下,就是 每种置换下不动点的数量之和除以置换的总数,得到染色方案的数量.        这道题,显然每种 ...

  9. [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

随机推荐

  1. mocha框架下,异步测试代码错误造成的问题----用例超时错误

    今天用抹茶(mocha)做个测试,发现有一个测试项目总是超时: describe("DbFactory functions",function(){ it("query ...

  2. vue给input file绑定函数获取当前上传的对象

    HTML <input type="file" @change="tirggerFile($event)"> JS(vue-methods) tir ...

  3. virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以

    virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以

  4. python的redis简单使用

    安装的Python版本 3.6.1 redis安装的2.8 安装redis模块 pip install redis 简单使用 redis-test.py import redis r=redis.Re ...

  5. javascript关于onclick()

    1 <html> <head> <title>js1 </title> <style> #content{ margin:0 auto; t ...

  6. 跨域、跨服务器调用时候session丢失的问题

    最近新进一个公司,做的项目是手机支付系统.由于涉及到金钱相关的,所以安全性要求特别的高.项目分了很多个子系统,在部署(测试)的时候是每个Tomcat上面只放一个子系统.比如现在有5个子系统,那么就会对 ...

  7. struts2 第一次使用 404 页面引发的一系列问题

    环境:ubuntu  . eclipse.struts-2.3.24 问题描写叙述: 1.  struts2 訪问出现404 2.  严重: Exception starting filter Str ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 集群容错

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 集群容错 在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重 ...

  9. 5 -- Hibernate的基本用法 --2 Hibernate入门

    5.2.1 Hibernate 下载和安装 5.2.2 Hibernate 的数据库操作 5.2.3 在Eclipse中使用Hibernate 啦啦啦

  10. 8 -- 深入使用Spring -- 3...1 Resource实现类UrlResource

    8.3.1 Resource 实现类------UrlResource : 访问网络资源的实现类 1.访问网络资源 访问网络资源通过UrlResource 类实现,UrlResource是java.n ...