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

1 1 1 2 7
2 3 1
3 1 2

Sample Output

2

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相关推荐

  1. P1446 [HNOI2008]Cards

    P1446 [HNOI2008]Cards 题意: 有n张牌,染三种颜色,每种颜色规定数目,给出m种不同的洗牌方法.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方 ...

  2. 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)

    置换群: 看半天置换群表示并看不懂QAQ 但顾名思义是置换组成的群 其实不用看懂也行,就拿简单的例子来说吧 有一个序列s = {1, 2, 3, 4, 5, 6} 和一个变换规则t = {2, 3, ...

  3. [bzoj1004][HNOI2008]Cards

    [bzoj1004][HNOI2008]Cards 标签: 置换 Burnside引理 题目链接 扯淡 题目中说了这样一句话 两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法 ...

  4. [HNOI2008] Cards

    Description 给出 \(n\) 张牌,要求染出 \(a\) 种红色,\(b\) 种蓝色,\(c\) 种zyz之色绿色.同时给出 \(m\) 种洗牌方法,两种染色方案相同当且仅当可以通过洗牌从 ...

  5. bzoj 1004: [HNOI2008]Cards

    /**************************************************************Problem: 1004User: lxy8584099Language ...

  6. 【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1004 学习了下polya计数和burnside引理,最好的资料就是:<Pólya 计数法的应用 ...

  7. BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】

    题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...

  8. BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]

    传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ...

  9. 信奥中的数学:母函数

    [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数.递推) [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数.递推)_Dango's happy ...

最新文章

  1. Spring Cloud源码分析(二)Ribbon(续)
  2. jdk170不支持注释_JDK 9 @不建议使用的注释增强功能
  3. Linux内核配置系统浅析
  4. NTP时间服务器实现Linux时间同步
  5. centos7常用工具安装手册
  6. Arbitrage(判断正环 spfa写法)
  7. MyEclipse打包jar 并加入第三方包
  8. Modifier ‘public‘ is redundant for interface methods错误
  9. 愚人节的礼物Java
  10. 【图解】FFmpeg播放器基本原理
  11. 用python开发文本翻译小软件
  12. 二级展开式斜齿圆柱齿轮减速器
  13. 什么是外汇EA呢?工作的原理又是什么呢?送给不懂外汇EA
  14. 网站的robots 文件写法 附自动生成工具网址
  15. 翻车!误删/usr/lib/引发的血案,从棺材边成功抢救的过程分享。
  16. 转载:用聚宽实现一个多因子策略
  17. 红糖水白糖水的转换--郝汉森
  18. C#语言中的重要知识详细介绍
  19. 【C语言】冒泡排序学习笔记
  20. java nio 缓冲区(二)

热门文章

  1. 读小学的宝宝人缘好,收到同学赠送的小瓶茅台酒!
  2. SAP PM设备主记录
  3. 在时间关系数据上AutoML:一个新的前沿
  4. 何恺明、陈鑫磊新研究:提出实例分割新方法,效果比肩Mask R-CNN
  5. 干货丨一文介绍机器学习中基本的数学符号
  6. 集成学习(Bagging和AdaBoost和随机森林(random forest))
  7. 新基建下的自动驾驶:单车智能和车路协同之争
  8. 经由因果分析,反驳AI监控学生上课,及辨别健康类谣言
  9. 一线专家谈2020年人工智能落地趋势
  10. “众声喧哗”中的VR,谁来买单?