正题

题目链接:https://www.luogu.com.cn/problem/P1446


题目大意

三个颜色的一些东西排在一起,给mmm种置换,求本质不同的染色方案数。


解题思路

BurnsideBurnsideBurnside引理:置换集合GGG时本质不同的序列方案等于∑x∈Gc(x)∣G∣\frac{\sum_{x\in G}c(x)}{|G|}∣G∣∑x∈G​c(x)​,c(x)c(x)c(x)表示置换xxx中的不动点个数。

也就是每个循环中的颜色都相同,可以把每个循环视为一个物品,然后放入容量为r,g,br,g,br,g,b的背包里的方案数,求解即可。

时间复杂度O(r∗g∗b∗m)O(r*g*b*m)O(r∗g∗b∗m)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll r,b,g,m,p,n,tot,ans;
ll siz[81],f[21][21][21],y[81];
bool v[81];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
ll solve(){memset(f,0,sizeof(f));memset(v,0,sizeof(v));tot=0;for(ll i=1;i<=n;i++){if(v[i])continue;siz[++tot]=0;ll x=i;while(!v[x]){siz[tot]++;v[x]=1;x=y[x];}}f[0][0][0]=1;for(ll x=1;x<=tot;x++)for(ll i=r;i>=0;i--)for(ll j=g;j>=0;j--)for(ll k=b;k>=0;k--){if(i>=siz[x])(f[i][j][k]+=f[i-siz[x]][j][k])%=p;if(j>=siz[x])(f[i][j][k]+=f[i][j-siz[x]][k])%=p;if(k>=siz[x])(f[i][j][k]+=f[i][j][k-siz[x]])%=p;}return f[r][g][b];
}
int main()
{scanf("%lld%lld%lld%lld%lld",&r,&g,&b,&m,&p);n=r+b+g;for(ll i=1;i<=n;i++)y[i]=i;ans=solve();for(ll i=1;i<=m;i++){for(ll j=1;j<=n;j++)scanf("%lld",&y[j]);(ans+=solve())%=p;}printf("%lld\n",ans*power(m+1,p-2)%p);return 0;
}

P1446-[HNOI2008]Cards【Burnside引理,dp】相关推荐

  1. P1446 [HNOI2008]Cards

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

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

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

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

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

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

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

  5. [bzoj1004][HNOI2008]Cards

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

  6. [HNOI2008]Cards

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

  7. POJ 2888 Magic Bracelet ——Burnside引理

    [题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...

  8. 置换群和Burnside引理,Polya定理

    定义简化版: 置换,就是一个1~n的排列,是一个1~n排列对1~n的映射 置换群,所有的置换的集合. 经常会遇到求本质不同的构造,如旋转不同构,翻转交换不同构等. 不动点:一个置换中,置换后和置换前没 ...

  9. [HNOI2008] Cards

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

最新文章

  1. php伪类型,解密PHP伪类型和伪变量的含义
  2. leetcode算法题--合并两个有序链表
  3. 让Apache支持Rewrite静态页面重写的方法
  4. redis高并发抽奖
  5. [蓝桥杯2018初赛]分数-找规律
  6. 蒙特 卡罗方法matlab,蒙特·卡罗方法中的数学之美,你一定不想错过
  7. [undo]ip address ppp-negotiate
  8. 为 Analysis Services 数据库使用扩展字段属性(SQL Server 2005 联机丛书(2008 年 11 月))...
  9. python-14:迭代器 生成器,3种方法:g.__next__() next(g) g.send(value)
  10. sql server 2008导出数据至Excel或者wps
  11. linux应用程序使用aplay播放,Linux中如何解决Aplay不能播放问题
  12. AutoCAD输出矢量图
  13. 职场中,什么样的人最容易升职?
  14. Windows密钥备份
  15. Android自定义view之围棋动画(化繁为简)
  16. java 游戏背景mp3音乐_java飞机大战(带背景音乐) 游戏原码下载
  17. SQL Server 2014下载及安装教程
  18. QQ如何应对中年困境?
  19. 主机名 域名 网站名 URL
  20. excel两个指标相关性分析_用Excel做相关性分析方法

热门文章

  1. oracle 产看执行计划_ODBA 技能SPM计划
  2. matlab求滤波器的冲激响应,在TMS320C5410上用MATLAB实现有限冲激响应滤波器
  3. 统计学习导论_统计机器学习之扫盲导论篇
  4. Java项目几个月能完成_c#项目转JAVA,第5个月,基本完成
  5. 软件构造学习笔记-第二周
  6. leetcode18. 四数之和(双指针)
  7. c语言glut打正方形,OpenGL绘制正方形并用键盘移动
  8. LeetCode 1122 数组的相对排序-简单-unordered_map容器的应用
  9. 第七届蓝桥杯决赛真题 - 凑平方数-全排列+dfs+set去重
  10. Piggy-Bank POJ - 1384(完全背包+背包放满)