题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数。

  置换群的burnside引理,还有个Pólya过几天再看看。。。

  burnside引理:有m个置换k种颜色,所有本质不同的染色方案数就是每种置换的不变元素的个数的平均数。

  求每种置换的不变元素的个数用背包解决。因为置换之后元素不变,所以对于每个循环节我们要染一个颜色,于是先处理出循环节作为背包中的“物体”,然后一个三维背包解决。f[i][j][k]的i j k表示三种颜色分别还可以染多少次。

  除m%p用费马小定理就行了,我才不用exGCD...(QAQ因为老是忘记怎么写,快速幂多资磁

  没清零WA了2次。。。最近老是出小问题

  UPD:去看了一波polya定理,例题poj2409中,一开始我不理解为什么旋转1次和旋转2次要当做2个置换,看了群的概念才知道呜呜呜....  

  封闭性就是指连续运算得到的结果也在群里面,所以旋转1次和旋转2次要当做两个置换。

  但是回到这题,为什么不用将任意一个置换再生成新的置换再计算呢?原来...

  

  “输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替”就满足了置换群的定义,多次洗牌->连续运算,可用一种代替 说明这连续运算的结果也算是一种置换。

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
void read(ll &k)
{
k=;int f=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
ll sr,sb,sg,m,p,n,ans;
ll next[],a[][],d[],f[][][][];
ll dp(int x)
{
int cnt=;
for(int i=;i<=n;i++)next[i]=;
for(int i=;i<=n;i++)
if(!next[i])
{
d[++cnt]=next[i]=;
int p=i;
while(!next[a[x][p]])
{
p=a[x][p];
next[p]=;
d[cnt]++;
}
}
for(int i=;i<=sr;i++)
for(int j=;j<=sb;j++)
for(int k=;k<=sg;k++)
f[][i][j][k]=f[][i][j][k]=;
f[][][][]=;
int now=;
for(int l=;l<=cnt;l++)
{
for(int i=;i<=sr;i++)
for(int j=;j<=sb;j++)
for(int k=;k<=sg;k++)
{
if(i>=d[l])f[now][i][j][k]=(f[now^][i-d[l]][j][k]+f[now][i][j][k])%p;
if(j>=d[l])f[now][i][j][k]=(f[now^][i][j-d[l]][k]+f[now][i][j][k])%p;
if(k>=d[l])f[now][i][j][k]=(f[now^][i][j][k-d[l]]+f[now][i][j][k])%p;
}
now^=;
}
return f[now^][sr][sb][sg];
}
ll mi(ll a,int b)
{
ll t=,y=a;
while(b)
{
if(b&)t=(t*y)%p;
y=(y*y)%p;
b>>=;
}
return t%p;
}
int main()
{
read(sr);read(sb);read(sg);read(m);read(p);n=sr+sb+sg;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
read(a[i][j]);
m++;
for(int i=;i<=n;i++)a[m][i]=i;
for(int i=;i<=m;i++)
ans=(ans+dp(i))%p;
printf("%lld\n",ans*mi(m,p-)%p);
}

bzoj1004: [HNOI2008]Cards(burnside引理+DP)的更多相关文章

  1. BZOJ1004: [HNOI2008]Cards(Burnside引理 背包dp)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4255  Solved: 2582[Submit][Status][Discuss] Descript ...

  2. bzoj1004 [HNOI2008]Cards Burnside 引理+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1004 题解 直接 Burnside 引理就可以了. 要计算不动点的个数,那么对于一个长度为 \ ...

  3. 【bzoj1004】[HNOI2008]Cards Burnside引理+背包dp

    题目描述 用三种颜色染一个长度为 $n=Sr+Sb+Sg$ 序列,要求三种颜色分别有 $Sr,Sb,Sg$ 个.给出 $m$ 个置换,保证这 $m$ 个置换和置换 ${1,2,3,...,n\choo ...

  4. 【BZOJ1004】[HNOI2008]Cards Burnside引理

    [BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...

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

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

  6. BZOJ 1004 HNOI2008 Cards Burnside引理

    标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...

  7. BZOJ1004 HNOI2008 Cards Burnside、背包

    传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...

  8. BZOJ 1004 Cards(Burnside引理+DP)

    因为有着色数的限制,故使用Burnside引理. 添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数, 每个循环节的长度. 则ans=sigma(f(i))/(m+1) % ...

  9. [BZOJ1004][HNOI2008]Cards 群论+置换群+DP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. ...

随机推荐

  1. Qt官方开发环境生成的exe发布方式

    本来想自己写一个打包程序的文章了,但是我发现了宝贝,在这里,大神写的比我牛逼的多了,这里做一下搬运工 一是为了方便大家 二是为了以后方便自己找 原文链接:http://tieba.baidu.com/ ...

  2. Qt listwigwt item 加入自定义元素

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  3. 1.1.0 Unity零基础入门2——Roll a Ball

    1. 游戏界面 2.代码 //FoodRotate - - 控制cube旋转 using System.Collections; using System.Collections.Generic; u ...

  4. 【rich-text】 富文本组件说明

    [rich-text] 富文本组件可以显示HTML代码样式. 1)支持事件:tap.touchstart.touchmove.touchcancel.touchend和longtap 2)信任的HTM ...

  5. DNA序列 (DNA Consensus String,ACM/ICPC Seoul 2006,UVa1368

    题目描述:算法竞赛入门经典习题3-7 题目思路:每列出现最多的距离即最短 #include <stdio.h> #include <string.h> int main(int ...

  6. 数据库Mysql的学习(八)-储存过程和事务和导入导出

    储存过程 DELIMITER // CREATE PROCEDURE pro1() BEGIN SELECT book_id,book_name,category FROM bookinfo t1 J ...

  7. Sql server在cmd下的使用

    方法一 在DOS提示符下,c:\>isql -U sa -P (此处输入SA密码) 注----大小写敏感 回车后会出现"1>"提示符,表明已成功,此时可在DOS下做任何 ...

  8. 福大软工1816:beta版本冲刺前准备

    BETA 版冲刺前准备 队名:第三视角 作业链接 组长博客 应作业要求为了更加顺利地开展beta版本的冲刺,上次的alpha版本展示后,我们组对之前开发过程中存在的各种问题进行了全面的讨论,并对其进行 ...

  9. Response.End方法

    文章:在try...catch语句中执行Response.End()后如何停止执行catch语句中的内容 调用Response.End()方法能保证,只输出End方法之前的内容. 调用Context. ...

  10. C#及时释放代码

    using语句,定义一个范围,在范围结束时释放对象. 场景: 当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose. 要达到这样的目的,用t ...