当前位置:网站首页>P1446 [HNOI2008]Cards(Burnside定理+dp计数)
P1446 [HNOI2008]Cards(Burnside定理+dp计数)
2022-04-23 06:21:00 【Zimba_】
题意:
要给一副牌染色,染成 S r S_{r} Sr张红色, S b S_{b} Sb张蓝色, S g S_{g} Sg张绿色。现给出了 m m m种洗牌法(置换),当一副牌可以通过这 m m m种洗牌法 (可以用多种洗法,每种可以用多次)洗成另一副牌时,则称这两副牌是同一种。问能染出多少种不同副牌。
m a x { S r , S b , S g } ≤ 20 , m ≤ 60 max\{S_{r},S_{b},S_{g}\}\leq20,m\leq60 max{
Sr,Sb,Sg}≤20,m≤60
思路:
显然是 B u r n s i d e Burnside Burnside定理的运用(会不会用是另一回事)。
公式:
N ( G , C ) = 1 ∣ G ∣ ∑ f ∈ G C ( f ) N(G,C)=\frac{1}{|G|}\sum_{f\in G}C(f) N(G,C)=∣G∣1f∈G∑C(f)简单 介绍一下这个公式, G G G是置换群, C C C是着色集, C ( f ) C(f) C(f)是置换 f f f在着色集 C C C下的不动点数。
至于置换群要符合的要求,不是很懂。
这里的话, G G G里面的是,单位置换和 m m m种洗牌置换。着色集就是满足数量的三种颜色的所有不同排列。
我们考虑统计某个置换的不动点数。
然后会发现,一种着色在某个置换下不动,当前仅当每个循环节中的颜色相同。所以,我们对于每个置换,求出它的循环节,然后用 d p dp dp计数就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int Sr,Sb,Sg,m,p;
int n;
int a[105];
int flag[105];
int dp[30][30][30];
int getC()
{
memset(flag,0,sizeof(flag));
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int i=1;i<=n;i++)if(!flag[i])
{
int now=i;
flag[now]=1;
int num=1;
while(!flag[a[now]])
{
num++;
now=a[now];
flag[now]=1;
}
for(int r=Sr;r>=0;r--)
{
for(int b=Sb;b>=0;b--)
{
for(int g=Sg;g>=0;g--)
{
if(r>=num)dp[r][b][g]=(dp[r][b][g]+dp[r-num][b][g])%p;
if(b>=num)dp[r][b][g]=(dp[r][b][g]+dp[r][b-num][g])%p;
if(g>=num)dp[r][b][g]=(dp[r][b][g]+dp[r][b][g-num])%p;
}
}
}
}
return dp[Sr][Sb][Sg];
}
int fpow(int a,int n,int p)
{
int sum=1,base=a;
while(n!=0)
{
if(n%2)sum=sum*base%p;
base=base*base%p;
n/=2;
}
return sum;
}
int main()
{
scanf("%d%d%d%d%d",&Sr,&Sb,&Sg,&m,&p);
n=Sr+Sb+Sg;
int ans=0;
for(int i=1;i<=n;i++)a[i]=i;
ans=(ans+getC())%p;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)scanf("%d",&a[j]);
ans=(ans+getC())%p;
}
printf("%d\n",ans*fpow(m+1,p-2,p)%p);
return 0;
}
版权声明
本文为[Zimba_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43785386/article/details/108197481
边栏推荐
- Jiangning hospital DMR system solution
- 理解补码的要点
- Machine vision series (01) -- Overview
- 基于可视化结构的身份证号码校验系统-树莓派实现
- Transformer的pytorch实现
- go iris框架实现多服务Demo:通过(监听8083端口的)服务1中的接口启动(监听8084端口的)服务2
- kaggle-房价预测实战
- presto日期函数的使用
- DMR system solution of Kaiyuan MINGTING hotel of Fengqiao University
- How to improve the service efficiency of the hotel without blind spots and long endurance | public and Private Integrated walkie talkie?
猜你喜欢
Urban emergency management - urban emergency communication command and dispatching system
直观理解熵
el-date-picker中自定义快捷选项picker-options,动态设置禁用日期
Us photo cloud editing helps BiliBili upgrade its experience
Background management system framework, there is always what you want
关于'enum'枚举类型以及结构体的问题。
记录一些npm 有关的问题(杂乱记录)
Draw margin curve in arcface
可视化常见绘图(三)面积图
后台管理系统框架,总有你想要的
随机推荐
Mysql持久性的实现
VIM使用
How does the public and Private Integrated walkie talkie realize cooperative work under multi-mode communication?
anaconda3安装
Pycharm
golang实现MD5,SHA256,bcrypt加密
# 可视化常见绘图(二)折线图
el-table的数据更新后,页面中数据未更新this.$forceUpdate()无效果
数据分析学习(一)数据分析和Numpy基础
JDBC连接池
可视化常见问题解决方案(七)画图刻度设置解决方案
ESP32学习-GPIO的使用与配置
PyTorch 10. Learning rate
推导式与正则式
quill-editor图片缩放、在一个页面使用多个富文本框、quill-editor上传图片地址为服务器地址
null和undefined的区别
字节跳动2020秋招编程题:根据工号快速找到自己的排名
记录一下使用v-print中遇到的问题
Jiangning hospital DMR system solution
浅谈BFC(块格式化上下文)