BZOJ 1004: [HNOI2008]Cards
Description
给你一个序列,和m种可以使用多次的置换,用3种颜色染色,求方案数%p.
Sol
Burnside定理+背包.
Burnside定理 \(N(G,\mathbb{C})=\frac {1}{\left | G \right |}\sum_{f\in G}\left |\mathbb{C}(f) \right |\)
\(\mathbb{C}\) 中非等价的着色数等于在 \(G\) 中的置换作用下保持不变的着色的平均数.《组合数学》
对于每一种置换 求出关于置换的一个有向圈(相当于一个连通块),这里有更好的算法,但是我没怎么想,反正范围小直接用的并查集暴力置换合并.
想让计算不定置换,就要将每个有向圈染成同样的颜色,然后用背包求出来.
注意,它可以不用任何一种置换,所以要加上单位元的置换,这个可以直接用组合数学求出来,逆元随便搞搞就可以了.
Code
/**************************************************************
Problem: 1004
User: BeiYu
Language: C++
Result: Accepted
Time:260 ms
Memory:2368 kb
****************************************************************/ #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int N = 65; int n,m,sr,sb,sg,Mo,cnt,ans;
int a[N],tmp[N],sz[N],id[N];
int f[N][N][N],p[N]; inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
inline int Pow(int a,int b,int res=1){ for(;b;b>>=1,a=a*a%Mo) if(b&1) res=res*a%Mo;return res; } int Find(int x){ return p[x]==x?x:p[x]=Find(p[x]); }
void Merge(int u,int v){
int f1=Find(u),f2=Find(v);
if(f1!=f2) p[f2]=f1;
}
int work(){
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=n;i++) a[i]=in();
for(int i=1;i<=n;i++){
for(int i=1;i<=n;i++) Merge(i,a[i]);
for(int i=1;i<=n;i++) tmp[i]=a[a[i]];
for(int i=1;i<=n;i++) a[i]=tmp[i];
// for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
}
cnt=0;
memset(sz,0,sizeof(sz));memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) if(p[i]==i) id[i]=++cnt;
for(int i=1;i<=n;i++) sz[id[Find(i)]]++;
f[0][0][0]=1;
for(int u=1;u<=cnt;u++){
for(int i=sr;~i;i--) for(int j=sb;~j;j--) for(int k=sg;~k;k--){
if(i>=sz[u]) f[i][j][k]=(f[i][j][k]+f[i-sz[u]][j][k])%Mo;
if(j>=sz[u]) f[i][j][k]=(f[i][j][k]+f[i][j-sz[u]][k])%Mo;
if(k>=sz[u]) f[i][j][k]=(f[i][j][k]+f[i][j][k-sz[u]])%Mo;
}
}return f[sr][sb][sg];
}
int main(){
// freopen("in.in","r",stdin);
sr=in(),sb=in(),sg=in(),m=in(),Mo=in(),n=sr+sb+sg; ans=1;
for(int i=1;i<=n;i++) ans=(ans*i)%Mo;
for(int i=1;i<=sr;i++) ans=(ans*Pow(i,Mo-2))%Mo;
for(int i=1;i<=sb;i++) ans=(ans*Pow(i,Mo-2))%Mo;
for(int i=1;i<=sg;i++) ans=(ans*Pow(i,Mo-2))%Mo; for(int i=1;i<=m;i++) ans=(ans+work())%Mo;
cout<<ans*Pow(m+1,Mo-2)%Mo<<endl;
return 0;
}
BZOJ 1004: [HNOI2008]Cards的更多相关文章
- 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(群论)
好吧我就是蒟蒻根本没听说过群论(虽说听叉姐说几万年都不会考) 我也讲不太来,直接戳VFK大神的blog啦 = = http://vfleaking.blog.163.com/blog/static/1 ...
- BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]
传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ...
- 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很 ...
- 【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)
http://www.lydsy.com/JudgeOnline/problem.php?id=1004 学习了下polya计数和burnside引理,最好的资料就是:<Pólya 计数法的应用 ...
随机推荐
- Runner站立会议07
开会时间:21.10~21.30 地点:基教负一 今天做了什么:看网上下载的日历代码 明天准备做什么:继续看代码 遇到的困难:下载的代码有很多看不懂的地方,很多包.函数等都不知道 会议图: 燃尽图:
- jsp机制基础
JSP 和Servlet技术一样,JSP也是SUN公司定义的一种开发动态web资源的技术,属于JavaEE技术之一.JSP实际上就是Servlet,它们在一起又称JSP/Servlet规范. Serv ...
- IntelliJ IDEA 当pom.xml更新时,自动加载pom.xml
http://stackoverflow.com/questions/19444471/intellij-idea-how-to-synchronize-project-libraries-with- ...
- Java使用Jetty实现嵌入式Web服务器及Servlet容器
Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也可以嵌入在Java应用程序中,在Java程序中调用Jetty. ...
- 用apache-cxf生成webservice客户端的时候报错Parameter: shead already exists for method
版本apache-cxf-3.1.0 命令如下:wsdl2java -p com.wz.interfaces -d ./src -client ./ws/xxx.wsdl 报错如下: WSDLToJa ...
- 用HTML/JS/PHP方式实现页面延时跳转
WEB开发中经常会遇到页面跳转或延时跳转的需求,掌握各种页面跳转方式非常必要. 以下是我总结有用HTML/JS/PHP三类方式实现跳转的方法,例子皆为三秒后跳转到index.php 页面. 1,HTM ...
- objective-c与c++的差异
oc的编译指令为 clang -fobjc-arc -framework Foundation test.m -o test oc中,1表示YES,0表示NO.并不是非0值都是YES,这是因为BOOL ...
- 修改PUTTY支持保存密码
1.从官网下载 Putty 0.60 Release 的 Windows 版源码 http://www.chiark.greenend.org.uk/~sgtatham/putty/download. ...
- Mastering Web Application Development with AngularJS 读书笔记(三)
第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...
- 2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解
序,线程是比进程小的进程,非常广泛的被使用. 一.继承Thread实现线程操作 1.注意setDaemon(boolean)方法,参数为true时为守护线程,参数为false时为用户线程. 守护线程的 ...