[HNOI2008]Cards
1004: [HNOI2008]Cards
Time Limit: 10 Sec Memory Limit: 162 MB
[Submit][Status][Discuss]
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。
置换群
因为每种颜色的牌的数量有限制,所以不能用Polya定理
用三维背包做Burnside引理
#include<cstdio> #include<cstring> int sr,sb,sg,sum[61],m,p,tot; int c[61],f[21][21][21]; bool v[61]; void mod(int &x) { x>=p ? x=x%p : x=x; } int pow(int a,int b,int p) {int r=1;while(b){if(b&1) r=r*a,mod(r);a=a*a,mod(a),b>>=1;}return r; } int work() {memset(v,0,sizeof(v));int now,cnt=0;memset(sum,0,sizeof(sum));for(int i=1;i<=tot;i++){if(v[i]) continue;now=i;cnt++; while(!v[now]) { v[now]=true; sum[cnt]++; now=c[now]; }}memset(f,0,sizeof(f));f[0][0][0]=1;for(int i=1;i<=cnt;i++)for(int r=sr;r>=0;r--)for(int b=sb;b>=0;b--)for(int g=sg;g>=0;g--){if(r>=sum[i]) f[r][b][g]+=f[r-sum[i]][b][g];if(b>=sum[i]) f[r][b][g]+=f[r][b-sum[i]][g];if(g>=sum[i]) f[r][b][g]+=f[r][b][g-sum[i]];mod(f[r][b][g]);}return f[sr][sb][sg]; } int main() {scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&p);tot=sr+sb+sg;for(int i=1;i<=tot;i++) c[i]=i;int ans=work();for(int i=1;i<=m;i++){for(int j=1;j<=tot;j++) scanf("%d",&c[j]);ans+=work(); mod(ans);}int inv=pow(m+1,p-2,p);ans*=inv;mod(ans);printf("%d",ans); }
转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7436069.html
[HNOI2008]Cards相关推荐
- P1446 [HNOI2008]Cards
P1446 [HNOI2008]Cards 题意: 有n张牌,染三种颜色,每种颜色规定数目,给出m种不同的洗牌方法.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方 ...
- 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)
置换群: 看半天置换群表示并看不懂QAQ 但顾名思义是置换组成的群 其实不用看懂也行,就拿简单的例子来说吧 有一个序列s = {1, 2, 3, 4, 5, 6} 和一个变换规则t = {2, 3, ...
- [bzoj1004][HNOI2008]Cards
[bzoj1004][HNOI2008]Cards 标签: 置换 Burnside引理 题目链接 扯淡 题目中说了这样一句话 两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法 ...
- [HNOI2008] Cards
Description 给出 \(n\) 张牌,要求染出 \(a\) 种红色,\(b\) 种蓝色,\(c\) 种zyz之色绿色.同时给出 \(m\) 种洗牌方法,两种染色方案相同当且仅当可以通过洗牌从 ...
- bzoj 1004: [HNOI2008]Cards
/**************************************************************Problem: 1004User: lxy8584099Language ...
- 【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)
http://www.lydsy.com/JudgeOnline/problem.php?id=1004 学习了下polya计数和burnside引理,最好的资料就是:<Pólya 计数法的应用 ...
- BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】
题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...
- BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]
传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ...
- 信奥中的数学:母函数
[HDU1085][HDU1028][HDU2013] 组合数学入门(母函数.递推) [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数.递推)_Dango's happy ...
最新文章
- Spring Cloud源码分析(二)Ribbon(续)
- jdk170不支持注释_JDK 9 @不建议使用的注释增强功能
- Linux内核配置系统浅析
- NTP时间服务器实现Linux时间同步
- centos7常用工具安装手册
- Arbitrage(判断正环 spfa写法)
- MyEclipse打包jar 并加入第三方包
- Modifier ‘public‘ is redundant for interface methods错误
- 愚人节的礼物Java
- 【图解】FFmpeg播放器基本原理
- 用python开发文本翻译小软件
- 二级展开式斜齿圆柱齿轮减速器
- 什么是外汇EA呢?工作的原理又是什么呢?送给不懂外汇EA
- 网站的robots 文件写法 附自动生成工具网址
- 翻车!误删/usr/lib/引发的血案,从棺材边成功抢救的过程分享。
- 转载:用聚宽实现一个多因子策略
- 红糖水白糖水的转换--郝汉森
- C#语言中的重要知识详细介绍
- 【C语言】冒泡排序学习笔记
- java nio 缓冲区(二)