【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)
http://www.lydsy.com/JudgeOnline/problem.php?id=1004
学习了下polya计数和burnside引理,最好的资料就是:《Pólya 计数法的应用》 --陈瑜希
burnside:
$$等价类的个数=\frac{1}{|G|}\sum_{i=1}^{s}D(a_i), a_i \in G$$其中$D(a_i)=a_i置换中染色后不变的方案$
而polya:
$$D(a_i)=k^{C(a_i)},其中C(a_i)是a_i的循环节个数$$证明很简单,要让染色不变,那么每个循环节的颜色一定要一样。
但是在这一题,颜色数目不是无限的,那么我们可以考虑DP
对于每个置换$a_i$,有循环节$cnt$个,每个循环节有$s[x]$个元素,那么我们用背包思想计数即可,设f[r,b,g]表示1~i的循环节用了r个红色,b个蓝色,g个绿色,有
f[r,b,g]=f[r-s[i], b, g]+f[r, b-s[i], g]+f[r, b, g-s[i]]
然后注意,因为是置换群,所以要满足群的定义,即题目虽然满足了逆元“对每种洗牌法,都存在一种洗牌法使得能回到原状态”,而封闭性和结合律只要是置换群都满足,所以还缺一个单位元的性质,因此我们要将单位元加进去再计数
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } const int N=65;
int a[N], s[N], vis[N], R, B, G, n, m, f[22][22][22], p, ans;
void add(int &a, const int &b) { a=(a+b)%p; a=(a+p)%p; }
int mpow(int a, int b) {
int ret=1;
for(; b; a=(a*a)%p, b>>=1) if(b&1) ret=(ret*a)%p;
return ret;
}
int getans() {
CC(f, 0); CC(s, 0); CC(vis, 0); int cnt=0;
for1(i, 1, n) if(!vis[i]) { ++cnt; for(int x=i; !vis[x]; x=a[x]) vis[x]=1, ++s[cnt]; }
f[0][0][0]=1;
for1(i, 1, cnt) for3(r, R, 0) for3(b, B, 0) for3(g, G, 0) {
if(r-s[i]>=0) add(f[r][b][g], f[r-s[i]][b][g]);
if(b-s[i]>=0) add(f[r][b][g], f[r][b-s[i]][g]);
if(g-s[i]>=0) add(f[r][b][g], f[r][b][g-s[i]]);
}
return f[R][B][G];
}
int main() {
read(R); read(B); read(G); read(m); read(p); n=R+B+G;
for1(i, 1, m) { for1(i, 1, n) read(a[i]); add(ans, getans()); }
for1(i, 1, n) a[i]=i;
add(ans, getans());
ans*=mpow(m+1, p-2);
printf("%d\n", ans%p);
return 0;
}
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
【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)的更多相关文章
- BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )
题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...
- [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】
题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...
- bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 http://poj.org/problem?id=2409 学习材料:https:/ ...
- BZOJ 1004 HNOI2008 Cards Burnside引理
标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...
- BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]
传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ...
- BZOJ 1004: [HNOI2008]Cards
Description 给你一个序列,和m种可以使用多次的置换,用3种颜色染色,求方案数%p. Sol Burnside定理+背包. Burnside定理 \(N(G,\mathbb{C})=\fra ...
- BZOJ 1004: [HNOI2008]Cards(群论)
好吧我就是蒟蒻根本没听说过群论(虽说听叉姐说几万年都不会考) 我也讲不太来,直接戳VFK大神的blog啦 = = http://vfleaking.blog.163.com/blog/static/1 ...
- bzoj 1004 1004: [HNOI2008]Cards burnside定理
1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1668 Solved: 978[Submit][Stat ...
- 【BZOJ 1004】 1004: [HNOI2008]Cards (置换、burnside引理)
1004: [HNOI2008]Cards Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很 ...
随机推荐
- Java网络编程-HTTP协议
HTTP协议的定义 这篇文章暂时不研究HTTP底层的TCP/IP的握手和挥手过程,只从表面的交互流程分析HTTP协议. HTTP英文全称是Hypertext Transfer Protpcol,也就是 ...
- npm发包流程
1.注册npm 账号 https://www.npmjs.com/signup 2.初始化npm项目 npm init 根据发的包进行填写: { "name": "wen ...
- ffmpeg Win8移植记(二)
接着上回说,http://www.cnblogs.com/zjjcy/p/3384517.html 上回移植了ffmpeg在ARM上面,只是纯C的代码,没有做汇编的优化.因为ffmpeg的ARM汇编是 ...
- windows C:\documents and settings拒绝访问
windows C:\documents and settings拒绝访问 CreationTime--2018年7月26日09点16分 Author:Marydon 1.情景再现 win+r-- ...
- php 缓冲区总结
我们先来看一段代码. <?php for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?> 按照php手册里的说法 该函数 ...
- 站点CSS样式不起作用,或仅仅有一部分起作用?随手记
事件:网页中使用了相同的样式,下半部分正常显示,上半部分样式所有丢失不能显示. 解决:改动了相应的CSS样式文件的编码 这个是最没有想到的解决的方法. 怎样调试:通过右键页面查看编码为UTF-8 或 ...
- Oracle常用函数脑图
全面的可参考(四)Oracle学习笔记—— 常见函数
- HTML-IE6兼容性问题及IE6常见BUG详细汇总
点评:IE6的兼容性问题一直都是前端工程师的恶梦,为了早早脱离这种困境,本文整理了一些相关兼容性的知识,感兴趣的朋友可以参考下哈,希望可以帮助到你- 1.终极方法:条件注释 <!--[if lt ...
- 【LeetCode】162. Find Peak Element (3 solutions)
Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...
- Android设计模式系列(2)--SDK源码之观察者模式
观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...