题目链接

luogu P1446 [HNOI2008]Cards

题解

题意就是求染色方案->等价类

洗牌方式构成成了一个置换群

然而,染色数限制不能用polay定理直接求解

考虑burnside引理

对于一个置换群其等价类的个数为置换中不动点的平均数

先暴力求出置换中的轮换,然后01背包DP求出不动点方案数

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using std::__gcd;
#define LL long long
const int maxn = 70;
inline int read() {
char c=getchar();int x=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
return x;
}
int sr,sb,sg,m,p,n,cnt;
bool vis[maxn],size[maxn*maxn];
int col[maxn],f[maxn][maxn][maxn];
inline void find() {//找到该置换中轮换的个数
cnt=0;
memset(vis,0,sizeof vis);
memset(size,0,sizeof col);
for(int i=1;i<=n;++i) {
if(!vis[i]) {
int p=i;cnt++;
while(!vis[p])vis[p]=1,size[cnt]++,p=col[p];
}
}
}
int count() {
memset(f,0,sizeof f);
f[0][0][0]=1;
for(int q=1;q<=cnt;++q)
for(int i=sr;i>=0;--i)
for(int j=sb;j>=0;--j)
for(int k=sg;k>=0;--k) {
if(i>=size[q]) f[i][j][k]=(f[i][j][k]+f[i-size[q]][j][k])%p;
if(j>=size[q]) f[i][j][k]=(f[i][j][k]+f[i][j-size[q]][k])%p;
if(k>=size[q]) f[i][j][k]=(f[i][j][k]+f[i][j][k-size[q]])%p;
}
return f[sr][sb][sg];
}
LL qpow(int x,int q) {
int ret=1;
for(int i=q;i;i>>=1,x=x*x%p)
if(i&1)ret=ret*x%p;
return ret;
}
int main() {
LL ans=0;
sr=read(),sb=read(),sg=read(),m=read(),p=read();
n=sr+sb+sg;
for(int i=1;i<=m;++i) {
for(int j=1;j<=n;++j) {
col[j]=read();
}
find();
ans+=count();
}
//m+1为不动置换
for(int i=1;i<=n;++i) col[i]=i;
find();
ans+=count();
ans=(ans*qpow(m+1,p-2))%p;
std::cout<<ans<<std::endl;
return 0;
}

luogu P1446 [HNOI2008]Cards的更多相关文章

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

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

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

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

  3. 洛谷P1446 [HNOI2008]Cards

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

  4. P1446 [HNOI2008]Cards

    题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案. 进一步,小春要求染出Sr张红色,Sb张蓝 ...

  5. [HNOI2008]Cards(dp,Burnside引理)

    Burnside引理: 参考自 某大佬对Burnside引理和Polya定理的讲解 相关概念 群:在数学中,群表示一个拥有满足封闭性.满足结合律.有单位元.有逆元的二元运算的代数结构. 置换群:由有限 ...

  6. 【bzoj1004】[HNOI2008]Cards

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2928  Solved: 1754[Submit][Sta ...

  7. bzoj 1004 1004: [HNOI2008]Cards burnside定理

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1668  Solved: 978[Submit][Stat ...

  8. BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )

    题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...

  9. [luogu P3195] [HNOI2008]玩具装箱TOY

    [luogu P3195] [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...

随机推荐

  1. SSTI注入绕过(沙盒逃逸原理一样)

    在python沙盒逃逸中绕过道理是一样的. 1.python沙盒中删除了很多模块,但是没有删除reload reload(__builtins__),重新加载被删除的模块,直接命令执行,只用于py2 ...

  2. python-使用pip安装第三方库报UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 7: invalid continuation byte 错误解决方案

    在python 的安装目录下找到Lib\ntpath.py文件,找到def join(path, *paths):方法,添加如下两行语句: reload(sys) sys.setdefaultenco ...

  3. (笔记) RealTimeRender[实时渲染] C2

    @author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...

  4. STL之list使用简介

    构造函数 list<int> c0; //空链表 list<); //建一个含三个默认值是0的元素的链表 list<,); //建一个含五个元素的链表,值都是2 list< ...

  5. 团队项目-第四次Scrum 会议

    时间:10.26 时长:30分钟 地点:线上 工作情况 团队成员 已完成任务 待完成任务 解小锐 编写project和projectGenerator类 编写下一步的规格说明 陈鑫 采用creator ...

  6. spring in action学习笔记十六:配置数据源的几种方式

    第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-r ...

  7. 物理和虚拟兼容性RDM的区别

    Difference between Physical compatibility RDMs and Virtual compatibility RDMs (2009226) Purpose This ...

  8. ubuntu 解压

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...

  9. mlock家族:锁定物理内存【转】

    转自:http://blog.csdn.net/fjt19900921/article/details/8074541 锁住内存是为了防止这段内存被操作系统swap掉.并且由于此操作风险高,仅超级用户 ...

  10. trickle charging current is 0A ?

    Recently, I test trickle charging current of the smart phone. It's 0A. ?????????????????????? yes, i ...