BZOJ1004 HNOI Cards
第一次学习置换群这个东西。
这题需要利用Burnside定理。
即我们求出循环节为一(转完不变)的个数的平均数也就是等价类的个数。
定义:设G={a1,a2,…ag}是目标集[1,n]上的置换群。每个置换都写成不相交循环的乘积。 c1(ak) 是在置换ak 的作用下不动点的个数,也就是长度为1的循环的个数(其实就是被置换ak 置换过后位置不变的元素个数)。通过上述置换的变换操作后可以相等的元素属于同一个等价类。若G将[1,n]划分成L个等价类,则:

证明:http://blog.csdn.net/gengmingrui/article/details/50564027
这样我们就相当于求每一种置换有多少不同的使得转完后不变的方案数,利用01背包可求。
而转完不变的意思就是转完后颜色还是原来的颜色。
然后答案是在mod p意义下的所以要用逆元。
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
int sr,sb,sg,m,p,n;
int e[][],size[],f[][][];
bool v[];
int dp(int x)
{
memset(f,,sizeof(f));
memset(size,,sizeof(size));
memset(v,,sizeof(v));
int cnt=;
for(int i=;i<=n;++i)
{
if(v[i])continue;
cnt++;int p=e[x][i];
while(!v[p])size[cnt]++,v[p]=,p=e[x][p];
}
f[][][]=;
for(int i=;i<=cnt;++i)
for(int SR=sr;SR>=;SR--)
for(int SB=sb;SB>=;SB--)
for(int SG=sg;SG>=;SG--)
{
if(SR>=size[i])f[SR][SB][SG]=(f[SR][SB][SG]+f[SR-size[i]][SB][SG])%p;
if(SB>=size[i])f[SR][SB][SG]=(f[SR][SB][SG]+f[SR][SB-size[i]][SG])%p;
if(SG>=size[i])f[SR][SB][SG]=(f[SR][SB][SG]+f[SR][SB][SG-size[i]])%p;
}
return f[sr][sb][sg];
}
int quick_mod(int a,int b)
{
int ans=;
while(b)
{
if(b&)ans=ans*a%p;
a=a*a%p;b>>=;
}
return ans;
}
int main()
{
scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&p);n=sb+sr+sg;
for(int i=;i<=m;++i)
for(int j=;j<=n;++j)
scanf("%d",&e[i][j]);
++m;int ans=;
for(int i=;i<=n;++i)e[m][i]=i;
for(int i=;i<=m;++i)
ans=(ans+dp(i))%p;
ans=(ans*quick_mod(m,p-))%p;
printf("%d\n",ans);
return ;
}
BZOJ1004 HNOI Cards的更多相关文章
- 【BZOJ1004】Cards(组合数学,Burnside引理)
[BZOJ1004]Cards(组合数学,Burnside引理) 题面 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Su ...
- [BZOJ1004](HNOI 2008) Cards
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目 前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张 ...
- bzoj1004 [HNOI2008]Cards 置换群+背包
[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...
- [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】
题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...
- BZOJ1004: [HNOI2008]Cards
三维01背包算出在每一个置换下不变的染色方案数,Burnside引理计算答案. PS:数据太水所以只算恒等置换也是可以过的. #include<bits/stdc++.h> using n ...
- BZOJ1004 [HNOI2008]Cards(Polya计数)
枚举每个置换,求在每个置换下着色不变的方法数,先求出每个循环的大小,再动态规划求得使用给定的颜色时对应的方法数. dp[i][j][k]表示处理到当前圈时R,B,G使用量为i,j,k时的方法数,背包思 ...
- [BZOJ1004] [HNOI2008] Cards (Polya定理)
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- BZOJ1004 HNOI2008 Cards Burnside、背包
传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...
随机推荐
- 你不知道的Static
Static静态字段,静态方法,静态代码块 壹 简介 一些场景下会要求一个类的多个实例共享一个成员变量:有时候想定义一些不和具体对象关联.不需要new就调用的方法 举例:Console类的Write ...
- SMTP暴力破解
这里实现一个SMTP的暴力破解程序,实验搭建的是postfix服务器,猜解用户名字典(user.txt)和密码字典(password.txt)中匹配的用户名密码对, 程序开发环境是: WinXP VC ...
- Django中的MiddleWare中间件
1. middleware简介 Django的middleware的概念相当于SSH框架里面的filter的概念.中间键的作用就是对所有的request,在request前,和在response后做一 ...
- bootstrap分页查询传递中文参数到后台(get方式提交)
<!--分页 --> <div style="width: 380px; margin: 0 auto; margin-top: 50px;"> <u ...
- ogg:Extract 进程遇长事务执行 Forcestop 引发的惨案
http://www.linuxidc.com/Linux/2015-04/115777.htm SQL> select t.addr,t.START_DATE from v$transacti ...
- docker之设置开机自启动(二)
docker的自启动 通过sysv-rc-conf等管理 启动脚本 # docker.service #!/bin/sh sudo systemctl enable docker sudo syste ...
- ACM——【百练习题备忘录】
1. 在做百练2807题:两倍时,错将判断语句写成 a/b ==2,正确写法是:a == b*2 因为C/C++int型做除法时自动舍入,如:5/2 == 2,但是 5 =/= 2*2. 2. 在做百 ...
- SQL:select case when 的用法
CASE 可能是 SQL 中被误用最多的关键字之一.虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法.例如,你可以在 WHERE 子句中使用 CASE. 首先让我们看一下 CASE 的语法 ...
- Spring学习-理解IOC和依赖注入
最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...
- day2 字典常用的方法
字典创建的方式: (1)d1 = {"k1":"v1","k2":"v2","k3":&qu ...