【BZOJ1004】[HNOI2008]Cards

题意:把$n$张牌染成$a,b,c$,3种颜色。其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$。并且给出$m$个置换,保证这$m$个置换加上本身的置换能构成一个置换群,两种染色方案被认为是相同的当且仅当一种方案可以通过某个置换变成另一种。求不同的染色方案数。答案对$P$取模。

$sa,sb,sc\le 20,m\le 60$

题解:这里对每种颜色都有一个限制,怎么办呢?

回顾从Burnside引理到Pólya定理的推导过程。

如果一个染色方案是不动点,那么它的每个循环中的所有元素的颜色都相同。

所以对于一个置换$f$,我们找到它的一个循环,大小为$k$,我们可以将其看成一个大小为$k$的物品,然后跑多维背包求出方案数,即为不动点的数目。

最后套用Burnside引理即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. int n,m,sa,sb,sc,P;
  5. int ans,f[21][21];
  6. int vis[61],to[61];
  7. inline int solve()
  8. {
  9. memset(f,0,sizeof(f)),memset(vis,0,sizeof(vis));
  10. int i,j,a,b,t;
  11. f[0][0]=1;
  12. for(i=1;i<=n;i++) if(!vis[i])
  13. {
  14. for(t=0,j=i;!vis[j];vis[j]=1,j=to[j],t++);
  15. for(a=sa;a>=0;a--) for(b=sb;b>=0;b--)
  16. {
  17. if(a>=t) f[a][b]+=f[a-t][b];
  18. if(b>=t) f[a][b]+=f[a][b-t];
  19. f[a][b]%=P;
  20. }
  21. }
  22. return f[sa][sb];
  23. }
  24. inline int pw(int x,int y)
  25. {
  26. int z=1;
  27. while(y)
  28. {
  29. if(y&1) z=z*x%P;
  30. x=x*x%P,y>>=1;
  31. }
  32. return z;
  33. }
  34. int main()
  35. {
  36. scanf("%d%d%d%d%d",&sa,&sb,&sc,&m,&P),n=sa+sb+sc;
  37. int i,j;
  38. for(j=1;j<=m;j++)
  39. {
  40. for(i=1;i<=n;i++) scanf("%d",&to[i]);
  41. ans+=solve();
  42. }
  43. for(i=1;i<=n;i++) to[i]=i;
  44. ans+=solve();
  45. printf("%d",ans*pw(m+1,P-2)%P);
  46. return 0;
  47. }

【BZOJ1004】[HNOI2008]Cards Burnside引理的更多相关文章

  1. bzoj1004: [HNOI2008]Cards(burnside引理+DP)

    题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...

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

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

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

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

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

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

  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. bzoj1004 [HNOI2008]Cards Burnside定理+背包

    题目传送门 思路:首先是Burnside引理,要先学会这个博客. Burnside引理我们总结一下,就是 每种置换下不动点的数量之和除以置换的总数,得到染色方案的数量.        这道题,显然每种 ...

  9. [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)

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

随机推荐

  1. 怎么让BarTender对象等间距分布

    在BarTender 2016设计条码标签时,我们需要让对象分布尽可能整齐美观,例如实现对象的对齐,对象等间距分布等.这些在作为世界上最好且最受信任的条码打印软件BarTender中,都是可以很轻松的 ...

  2. scanf_s,scanf安全版本

    %s,%c必须加sizeof(it)

  3. Python打包-py2exe

    上篇文章讲了pyinstaller,可以打包成包含Windows, Linux, Mac OS X, FreeBSD, Solaris and AIX等操作系统下的可执行文件,如果只针对Windows ...

  4. [SLAM] 02. Some basic algorithms of 3D reconstruction

    链接:http://www.zhihu.com/question/29885222/answer/100043031 三维重建 3D reconstruction的一个算法思路介绍,帮助理解 首先一切 ...

  5. [CNN] What is Convolutional Neural Network

    Ref: 从LeNet-5看卷积神经网络CNNs 关于这篇论文的一些博文的QAC: 1. 基本原理 MLP(Multilayer Perceptron,多层感知器)是一种前向神经网络(如下图所示),相 ...

  6. association 的使用

    <resultMap id="wmsTaskMap" type="WmsTask"> <id column="ID" jd ...

  7. SpringBoot------使用Fastjson解析Json数据

    方法一: 1.在pom.xml文件下添加依赖包 <dependency> <groupId>com.alibaba</groupId> <artifactId ...

  8. Hibernate_day03讲义_使用Hibernate完成一对多的关系映射并操作

  9. pip更换下载源(提升下载速度)

    经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,或者下载速度很慢,所以我们最好是将自己使用的pip源更换一下,这样就能解决被 ...

  10. U3D-FSM有限状态机的简单设计

    http://coder.beitown.com/archives/592 在之前的文章里介绍了一个基础U3D状态机框架(Unity3D游戏开发之状态流框架)即大Switch的枚举状态控制.这种方法虽 ...