传送门

题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色

$m \le 60,\ r,g,b \le 20$


咦,规定次数?

《组合数学》上不是有生成函数做法吗....

生成函数貌似可以和背包$DP$互相转换来着

然后就做出来了

每种置换求循环,$d[i][j][k][l]$表示前$i$个循环有了$j$个红$k$个绿$l$个蓝

遇到一点小问题,一直输出$0$

看了黄学长的代码发现他加了一个恒等置换....

想了一会儿才明白题目给的不是置换群,因为少了一个恒等置换.....

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=65;
typedef long long ll;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}int n,r,b,g,m,P,a[N];
int f[N],d[N][21][21],w[N],ans;
bool vis[N];
inline void mod(int &x){if(x>=P) x-=P;}
void dp(){int s=0;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++) if(!vis[i]){int u=a[i],len=1;while(u!=i) vis[u]=1,len++,u=a[u];w[++s]=len;}memset(d,0,sizeof(d));d[0][0][0]=1;for(int i=1;i<=s;i++)for(int j=r;j>=0;j--)for(int k=g;k>=0;k--)for(int l=b;l>=0;l--){if(j>=w[i]) mod(d[j][k][l]+=d[j-w[i]][k][l]);if(k>=w[i]) mod(d[j][k][l]+=d[j][k-w[i]][l]);if(l>=w[i]) mod(d[j][k][l]+=d[j][k][l-w[i]]);}mod(ans+=d[r][g][b]);
}
inline int Pow(int a,int b){int re=1;for(;b;b>>=1,a=a*a%P)if(b&1) re=re*a%P;return re;
}
inline int Inv(int a){return Pow(a,P-2);}
int main(){freopen("in","r",stdin);r=read();b=read();g=read();m=read();P=read();n=r+b+g;for(int j=1;j<=m;j++){for(int i=1;i<=n;i++) a[i]=read();dp();}m++;for(int i=1;i<=n;i++) a[i]=i;dp();ans=ans*Inv(m)%P;printf("%d",ans);
}

转载于:https://www.cnblogs.com/candy99/p/6479428.html

BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]相关推荐

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

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

  2. bzoj 1004: [HNOI2008]Cards

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

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

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

  4. bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3932  Solved: 2398 [Submit][Sta ...

  5. [HNOI2008]Cards

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MB [Submit][Status][Discuss] Description ...

  6. P1446 [HNOI2008]Cards

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

  7. [bzoj1004][HNOI2008]Cards

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

  8. BZOJ 1005: [HNOI2008]明明的烦恼

    BZOJ 1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线 ...

  9. bzoj 1010: [HNOI2008]玩具装箱toy(斜率dp)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 10837  Solved: 4513 [Submit] ...

最新文章

  1. echarts空数据如何设置_拼多多分时折扣如何设置优化?分时数据怎么看?
  2. JQuery IN ACTION读书笔记之一: JQuery选择器
  3. 【转载】使用Imaging组件加载GIF动画
  4. 开课吧java_开课吧javaee企业级开发工程师 十期
  5. storm基础系列之二----zookeeper的作用
  6. Jupyter notebook 中使用pip install安装第三方Python包
  7. 【资源分享】ArcFace Demo [Android]
  8. Java list.remove( )方法需要注意的地方
  9. 相机标定的来龙去脉(详解标定原理、畸变矫正原理、使用经验)
  10. mybatis 新增语句_mybatis增删改查
  11. 【渝粤教育】电大中专电子商务网站建设与维护_1作业 题库
  12. Java编写HTTP请求发送XML报文数据
  13. Bilibili缓存视频在电脑端直接打开方式
  14. python爬股指期货数据_股指期货高频数据机器学习预测
  15. 面试必备 | 带你彻底搞懂 Python 生成器。
  16. Hash算法及数字签名【六】
  17. PHP Imagick发光文字
  18. js简单插件(饼形图)
  19. Python数据分析与可视化(基础知识)
  20. JS方法/函数重载的姿势

热门文章

  1. xshell修改编辑文件并保存
  2. mysql中 routine
  3. Oracle索引状态查询与索引重建
  4. c语言函数操作一维数组
  5. tomcat 8.5 远程登录管理页面
  6. wordPress设计网页实践
  7. 20155301 Exp4 恶意代码分析
  8. iOS-获取通讯录信息
  9. spring boot(一):Hello World
  10. 博为峰JavaEE技术文章 ——MyBatis Provider之@SelectProvider SQL方法