[BZOJ1004] [HNOI2008] Cards (Polya定理)
Description
  小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有
多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方
案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.
两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗
成另一种.Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).
Input
  第一行输入 5 个整数:Sr,Sb,Sg,m,p(m<=60,m+1<p<100)。n=Sr+Sb+Sg。
接下来 m 行,每行描述一种洗牌法,每行有 n 个用空格隔开的整数 X1X2...Xn,恰为 1 到 n 的一个排列,
表示使用这种洗牌法,第 i位变为原来的 Xi位的牌。输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代
替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。
Output
不同染法除以P的余数
Sample Input
2 3 1
3 1 2
Sample Output
HINT
  有2种本质上不同的染色法RGB 和RBG,使用洗牌法231 一次可得GBR 和BGR,使用洗牌法312 一次 可得BRG 
和GRB。
  100%数据满足 Max{Sr,Sb,Sg}<=20。
Source
Solution
$Polya$定理($Burnside$引理)戳这
其作用就是求出有几种本质不同的染色方案
由于每种颜色的个数有限制,需要用三维的$0/1$背包求出每一种置换下不动点方案数(注意不洗牌也是一种置换)
呃,需要用乘法逆元,否则你会死得很难看
#include <bits/stdc++.h>
using namespace std;
int p, x[][], f[][][], siz[];
bool vis[]; int qpow(int a, int b)
{
int ans = ;
for(; b; b >>= , a = a * a % p)
if(b & ) ans = ans * a % p;
return ans;
} int main()
{
int sr, sg, sb, m, inv, ans = , tot;
cin >> sr >> sb >> sg >> m >> p;
for(int i = ; i <= m; ++i)
for(int j = ; j <= sr + sg + sb; ++j)
cin >> x[i][j];
for(int i = ; i <= sr + sg + sb; ++i)
x[m + ][i] = i;
for(int z = ; z <= m + ; ++z)
{
memset(f, , sizeof(f));
memset(vis, , sizeof(vis));
memset(siz, , sizeof(siz));
f[][][] = , tot = ;
for(int i = ; i <= sr + sg + sb; ++i)
if(!vis[i])
{
++tot;
for(int j = i; !vis[j]; j = x[z][j])
vis[j] = true, ++siz[tot];
}
for(int l = ; l <= tot; ++l)
for(int i = sr; ~i; --i)
for(int j = sg; ~j; --j)
for(int k = sb; ~k; --k)
{
if(i >= siz[l])
f[i][j][k] = (f[i][j][k] + f[i - siz[l]][j][k]) % p;
if(j >= siz[l])
f[i][j][k] = (f[i][j][k] + f[i][j - siz[l]][k]) % p;
if(k >= siz[l])
f[i][j][k] = (f[i][j][k] + f[i][j][k - siz[l]]) % p;
}
ans = (ans + f[sr][sg][sb]) % p;
}
cout << ans * qpow(m + , p - ) % p << endl;
return ;
}
[BZOJ1004] [HNOI2008] Cards (Polya定理)的更多相关文章
- BZOJ1004[HNOI2008]Cards——polya定理+背包
		题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色 ... 
- BZOJ1004 [HNOI2008]Cards(Polya计数)
		枚举每个置换,求在每个置换下着色不变的方法数,先求出每个循环的大小,再动态规划求得使用给定的颜色时对应的方法数. dp[i][j][k]表示处理到当前圈时R,B,G使用量为i,j,k时的方法数,背包思 ... 
- bzoj1004 [HNOI2008]Cards    Burnside定理+背包
		题目传送门 思路:首先是Burnside引理,要先学会这个博客. Burnside引理我们总结一下,就是 每种置换下不动点的数量之和除以置换的总数,得到染色方案的数量. 这道题,显然每种 ... 
- [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)
		Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ... 
- bzoj1004 [HNOI2008]Cards 置换群+背包
		[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ... 
- bzoj 1004 1004: [HNOI2008]Cards burnside定理
		1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1668 Solved: 978[Submit][Stat ... 
- bzoj1004: [HNOI2008]Cards(burnside引理+DP)
		题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ... 
- [BZOJ1004][HNOI2008]Cards 群论+置换群+DP
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. ... 
- BZOJ1004 [HNOI2008]Cards  【burnside定理 + 01背包】
		题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ... 
随机推荐
- cnblogs的使用
			cnblogs的使用 选择使用cnblogs而不是csdn,答案是很明显的.csdn每次创建博客之后会有一段时间的审核期,这大大的影响了用户体验.此外,cnblogs的用户群以及使用模式有着很大的诱惑 ... 
- vagrant系列教程(一):vagrant的安装与初识(转)
			[参考]https://github.com/astaxie/go-best-practice/blob/master/ebook/zh/01.1.md 阅读目录 下载一个合适的box 完成一个box ... 
- win7局域网共享文件
			调整共享文件所在电脑设置: 1. 关闭防火墙 2. 更改网络设置 ①打开网络和共享中心 ②进入"选择家庭组和共享选项" ③进入"更改高级共享设置" ④调整设置并 ... 
- FFT模板(多项式乘法)
			FFT模板(多项式乘法) 标签: FFT 扯淡 一晚上都用来捣鼓这个东西了...... 这里贴一位神犇的博客,我认为讲的比较清楚了.(刚好适合我这种复数都没学的) http://blog.csdn.n ... 
- CENTOS6.6下mysql5.7.11带boost和不带boost的源码安装
			本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn Mysql5.7版本更新后有很多变化,比如json等,连安装都有变化 ... 
- Shiro的原理及Web搭建
			shiro(java安全框架) 以下都是综合之前的人加上自己的一些小总结 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.使用Shiro的易于理解的A ... 
- 变态的IE
			1.IE7及更早版本, unshift()方法总是返回undefined而不是数组的新长度.2.IE8及之前版本, 在catch语句中捕获的错误对象会被添加到执行环境的变量对象, 而不是catch语句 ... 
- mongodb Decimal  Spring data mongodb Decimal128 SpringMvc 序列化字符串 json converter
			Mongodb 3.4 就开始支持Decimal 类型,解决double的精度问题,但是不太好用,MapReduce的时候Array.sum 也不能计算 Decimal.比较坑,但是聚合可以用 Spr ... 
- Oracle安装、Navicat for Oracle、JDBCl连接、获取表结构
			Oracle安装 Navicat for Oracle配置 Oracle JDBC连接(增删改查) Oracle安装 环境windows 7 64位 安装版本:oracle 11g(64位) 下载地址 ... 
- 1.2 PCI总线的信号定义
			PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种信号组成. PCI总线是一 ... 
