[bzoj1004][HNOI2008]Cards
[bzoj1004][HNOI2008]Cards
标签: 置换 Burnside引理
题目链接
扯淡
题目中说了这样一句话
两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)
怎么样?是不是很棘手。然而
输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。
题意
n张牌,3种颜色,给你一个置换集合G(且保证对于任意\(f,g\in G,fg \in G\)),让你对每张牌染色,使得红色Sred种,蓝色Sblue种,绿色Sgreen种。求不同的染色方案总数。
题解
根据burnside引理:等价类的个数等于每一个置换的不动点的个数之和的平均数。
如果是一个不动点的话,那么这个置换每一个循环中的元素颜色都一样。
这样我们就能跑一个三维背包了。
Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<vector>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
inline int read()
{int sum=0,p=1;char ch=getchar();while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();if(ch=='-')p=-1,ch=getchar();while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();return sum*p;
}const int maxn=100;int mod;int dp[maxn][maxn][maxn],sr,sb,sg,n,m,ans;int fa[maxn*3],w[maxn*3],cnt;int fin(int x)
{return x==fa[x]?x:fa[x]=fin(fa[x]);
}int power(int a,int b)
{int ans=1;while(b){if(b & 1)ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}void init()
{sr=read();sb=read();sg=read();n=sr+sb+sg;m=read();mod=read();REP(i,1,m+1){REP(j,1,n)fa[j]=j;if(i<m+1){REP(j,1,n){int v=read();int x=fin(j),y=fin(v);if(x!=y){fa[y]=x;}}}memset(w,0,sizeof(w));cnt=0;REP(col,1,n){int flag=1;REP(j,1,n){if(fin(j)==col){if(flag)flag=0,cnt++;w[cnt]++;}}}memset(dp,0,sizeof(dp));dp[0][0][0]=1;REP(j,1,cnt){DREP(x,sr,0){DREP(y,sb,0){DREP(z,sg,0){if(x>=w[j])dp[x][y][z]+=dp[x-w[j]][y][z];if(y>=w[j])dp[x][y][z]+=dp[x][y-w[j]][z];if(z>=w[j])dp[x][y][z]+=dp[x][y][z-w[j]];dp[x][y][z]%=mod;}}}}ans=(ans+dp[sr][sb][sg])%mod;}cout<<ans*power(m+1,mod-2)%mod<<endl;
}int main()
{freopen("input.in","r",stdin);freopen("output.out","w",stdout);init();return 0;
}
转载于:https://www.cnblogs.com/gzy-cjoier/p/7472722.html
[bzoj1004][HNOI2008]Cards相关推荐
- BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】
题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...
- [HNOI2008]Cards
1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MB [Submit][Status][Discuss] Description ...
- P1446 [HNOI2008]Cards
P1446 [HNOI2008]Cards 题意: 有n张牌,染三种颜色,每种颜色规定数目,给出m种不同的洗牌方法.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方 ...
- 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)
置换群: 看半天置换群表示并看不懂QAQ 但顾名思义是置换组成的群 其实不用看懂也行,就拿简单的例子来说吧 有一个序列s = {1, 2, 3, 4, 5, 6} 和一个变换规则t = {2, 3, ...
- [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 计数法的应用 ...
- 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 ...
最新文章
- 匹兹堡大学申请条件计算机科学,匹兹堡大学cs
- boost::hana::permutations用法的测试程序
- html5 audio音频播放全解析
- SAP CDS view权限控制实现原理介绍
- 我在芝加哥大学经济学系的博士生涯
- 为什么人们常说“十个创业九个死”?
- 中国姜黄根提取物行业市场供需与战略研究报告
- 清除浮动(HTML、CSS)
- android地图偏移谷歌中国地图偏移校正补丁,关于谷歌地图GPS偏移问题的解决办法...
- c语言中函数的知识点总结,c语言函数知识点总结
- cmd命令查询电脑序列号_硬盘序列号查询软件_如何查看电脑硬盘序列号
- Python学习17(GUI图形用户界面编程)
- 双目摄像头相关参数介绍
- c语言删除元素1116,C语言网-1116题-IP判断
- Google earth engine(GEE):基于MODIS的LST(地表温度数据)计算一定时间序列的城市热岛强度(UHI),并绘制直方图
- VitalTools 唯她CAD工具集
- Python之任意阶幻方的构造
- java 数据库排序_Java如何排序数据库表的数据内容?
- python 字典循环赋值,Python字典循环添加一键多值的用法实例
- LOG,Harris,SUSAN角点及边缘检测原理和代码实现