题意:有n张牌,有R+G+B=n的3种颜色及其数量,要求用这三种颜色去染n张牌。n张牌有m中洗牌方式,问在不同洗牌方式下本质相同的染色方案数。

解法:这道题非常有意思,题解参考Hzwer学长的。我这里再总结一下:

看到本质相同的染色方案我们很容易会想到Burnside引理和Polya定理,但是这题不能用Polya定理,为什么?因为一般的Ployd染色的颜色个数是没有限制的,于是当循环节为l颜色为c时候,方式数就是c^l(就是因为一个循环方案要相同所以染的颜色也要相同)。但是此题颜色个数有限制,不能直接每个格子有c种选择,所以不能使用Polyd定理。

那现在我们还是得保证一个循环内颜色相同但又不用Ployd呢?我们使用Burnside引理:可以想象成这样,我们必须要有R个红色,G个绿色,B个蓝色,且每一个循环节我们可以选择它染成R/G/B。那这不就是一个01背包模型,每个循环节就是一个物品,RGB就是容量限制,那么我们就可以用01背包计算方案数即可。

细节见代码及其注释。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=;
int n,r,g,b,m,P,a[],d[]; void exgcd(int a,int b,int& d,int& x,int& y) { //ax+by=gcd(a,b)
if (!b) { d=a;x=;y=; }
else { exgcd(b,a%b,d,y,x); y-=x*(a/b); }
} bool vis[];
LL dp[][N][N][N]; //dp[l][i][j][k]代表前l个循环节组成i个Rj个Gk个B的方案数
LL solve() { //每次计算置换群a的方案数(相当于做一次01背包)
for (int i=;i<=n;i++) vis[i]=;
int num=,now=;
for (int i=;i<=n;i++) { //统计循环节
if (vis[i]) continue;
d[++num]=; now=i; //循环节数量/大小
vis[now]=;
while (!vis[a[now]]) {
d[num]++;
vis[a[now]]=;
now=a[now];
}
}
for (int l=;l<=num;l++) for (int i=;i<=r;i++) for (int j=;j<=g;j++) for (int k=;k<=b;k++)
dp[l][i][j][k]=;
dp[][][][]=; //初始化
for (int l=;l<=num;l++) //循环节个数相当于物品个数
for (int i=;i<=r;i++)
for (int j=;j<=g;j++)
for (int k=;k<=b;k++) {
if (i>=d[l]) dp[l][i][j][k]=(dp[l][i][j][k]+dp[l-][i-d[l]][j][k])%P;
if (j>=d[l]) dp[l][i][j][k]=(dp[l][i][j][k]+dp[l-][i][j-d[l]][k])%P;
if (k>=d[l]) dp[l][i][j][k]=(dp[l][i][j][k]+dp[l-][i][j][k-d[l]])%P;
}
return dp[num][r][g][b];
} int main()
{
scanf("%d%d%d%d%d",&r,&g,&b,&m,&P);
n=r+g+b;
LL ans=;
for (int i=;i<=m;i++) {
for (int j=;j<=n;j++) scanf("%d",&a[j]);
ans+=solve(); //累加所有置换方案数
}
for (int i=;i<=n;i++) a[i]=i;
ans+=solve();
int x,y,d; exgcd(m+,P,d,x,y);
x=(x%P+P)%P; //求出m+1再模P下逆元
cout<<ans*x%P<<endl;
return ;
}

洛谷P1446/BZOJ1004 Cards Burnside引理+01背包的更多相关文章

  1. 洛谷 P4708 - 画画(Burnside 引理+组合数学)

    洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...

  2. 洛谷 P1446 [HNOI2008]Cards 解题报告

    P1446 [HNOI2008]Cards 题目描述 小春现在很清闲,面对书桌上的\(N\)张牌,他决定给每张染色,目前小春只有\(3\)种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun ...

  3. luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点

    LINK:Cards 不太会burnside引理 而这道题则是一个应用. 首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换. burnside引理: 其中D( ...

  4. 洛谷P1441 砝码称重 枚举 + 01背包

    显然,n<=20, m<=4 的数据范围一眼爆搜. 直接搜索一下不用哪4个砝码,再做一遍01背包即可. 可能是本人太菜鸡,01背包部分调了半天QAQ-- #include<cstdi ...

  5. 洛谷P1164小A点菜(01背包)

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  6. 洛谷 P2871 [USACO07DEC]手链Charm Bracelet && 01背包模板

    题目传送门 解题思路: 一维解01背包,突然发现博客里没有01背包的板子,补上 AC代码: #include<cstdio> #include<iostream> using ...

  7. 洛谷P1446 [HNOI2008]Cards

    置换群+dp #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring& ...

  8. 洛谷 P1282 多米诺骨牌("01"背包)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://blog.csdn.net/Darost/artic ...

  9. 洛谷——2871[USACO07DEC]手链Charm Bracelet——01背包

    题目描述 Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like t ...

随机推荐

  1. Test 6.24 T2 集合

    问题描述 有一个可重集合,一开始只有一个元素 0. 你可以进行若干轮操作,每轮你需要对集合中每个元素 x 执行以下三种操作之一: 将 x 变为 x+1; 选择两个非负整数 y,z 满足 y+z=x , ...

  2. hdu 4845 : 拯救大兵瑞恩 (bfs+状态压缩)

    题目链接 #include<bits/stdc++.h> using namespace std; typedef long long LL; int n,m,p,s,k; ,,,-}; ...

  3. jquery用法第二波

    过滤器 属性过滤选择器: $("div[id]")选取有id属性的<div> $(“#id”) $("div[title=test]")选取titl ...

  4. Dubbo学习-6-springboot整合dubbo

    1.在前面帖子和工程的基础上,这里使用springboot整合dubbo,首先创建springboot项目: https://start.spring.io/  进入spring Initializr ...

  5. 玩转MaxCompute studio SQL编辑器

    SQL因其简单易学的特点,是用户与MaxCompute服务交互的主要手段.如何帮助用户高效愉快的编写SQL是MaxCompute studio的核心使命,下面就让我们来一探究竟: 忘记语法 相信大家都 ...

  6. P2627 修剪草坪 (单调队列优化$dp$)

    题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...

  7. centos mysql初探 -- 配置、基本操作及问题

    目录: centos安装mysql 使用mysql客户端进行简单操作 python2和python3连接mysql mysql导入文件问题 死锁解决办法 windows 7 远程连接 mysql 服务 ...

  8. PHP 中 Error 和 Exception 两种异常的特性及日志记录或显示

    PHP 文档: Error Exception 参考: 深入理解PHP原理之异常机制 我们什么时候应该使用异常 异常和错误 所有示例基于 PHP7. 应用中,关于错误的最佳实践是: 必须报告错误 开发 ...

  9. Nginx 在各种语言框架下的配置 - 以 codeigniter 为例

    对于各种语言常用的框架,Nginx 在官方的 Wiki 页面的 入门 部分提供了示例配置文件.具体可以参考这个页面的 Pre-canned Configurations 部分,这里列出了各种框架. 直 ...

  10. Drone 的插件 - Docker 插件

    Drone 插件市场 Drone 插件文档 原文地址 - Docker 插件的手册 Docker 插件可以用于构建镜像及发布镜像到 Docker registry.下面的 pipeline 配置,就使 ...