https://www.lydsy.com/JudgeOnline/problem.php?id=1004

输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。(保证置换的完备性)

要考虑1,2,3.。。n这个置换,然后算出每种置换的方案数,除上总置换数m+1,就是答案,因为有取模,所以需要算逆元,然后对与一种置换来说总的情况数可以用dp来计算,因为每一个置换群只能涂成一种颜色,然后我们需要满足涂的颜色种数满足条件,dp[i][j][k]维护当红i个,蓝j个,绿k个的总方案数,最后全部加到答案中乘上逆元即可

  1. /**************************************************************
  2. Problem: 1004
  3. User: walfy
  4. Language: C++
  5. Result: Accepted
  6. Time:932 ms
  7. Memory:3992 kb
  8. ****************************************************************/
  9.  
  10. //#pragma comment(linker, "/stack:200000000")
  11. //#pragma GCC optimize("Ofast,no-stack-protector")
  12. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  13. //#pragma GCC optimize("unroll-loops")
  14. #include<bits/stdc++.h>
  15. #define fi first
  16. #define se second
  17. #define mp make_pair
  18. #define pb push_back
  19. #define pi acos(-1.0)
  20. #define ll long long
  21. #define vi vector<int>
  22. #define mod 1000000007
  23. #define C 0.5772156649
  24. #define ls l,m,rt<<1
  25. #define rs m+1,r,rt<<1|1
  26. #define pil pair<int,ll>
  27. #define pli pair<ll,int>
  28. #define pii pair<int,int>
  29. #define cd complex<double>
  30. #define ull unsigned long long
  31. #define base 1000000000000000000
  32. #define fio ios::sync_with_stdio(false);cin.tie(0)
  33.  
  34. using namespace std;
  35.  
  36. const double g=10.0,eps=1e-;
  37. const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
  38.  
  39. ll quick(ll a,ll b,ll c)
  40. {
  41. ll ans=;
  42. while(b)
  43. {
  44. if(b & ) ans=ans*a%c;
  45. a=a*a%c;
  46. b>>=;
  47. }
  48. return ans;
  49. }
  50. int d[N][N],num[N],dp[][N][N][N];
  51. bool vis[N];
  52. int main()
  53. {
  54. int a,b,c,n,m,p;
  55. scanf("%d%d%d%d%d",&a,&b,&c,&m,&p);
  56. n=a+b+c;
  57. for(int i=;i<=m;i++)
  58. for(int j=;j<=n;j++)
  59. scanf("%d",&d[i][j]);
  60. for(int i=;i<=n;i++)d[m+][i]=i;
  61. m++;
  62. ll ans=;
  63. for(int i=;i<=m;i++)
  64. {
  65. int cnt=;
  66. memset(num,,sizeof num);
  67. memset(vis,,sizeof vis);
  68. for(int j=;j<=n;j++)
  69. {
  70. if(!vis[j])
  71. {
  72. num[++cnt]=;
  73. vis[j]=;
  74. int now=d[i][j];
  75. while(now!=j)
  76. {
  77. vis[now]=;
  78. now=d[i][now];
  79. num[cnt]++;
  80. }
  81. }
  82. }
  83. int now=,pre=;
  84. dp[now][][][]=;
  85. for(int j=;j<=cnt;j++)
  86. {
  87. swap(now,pre);
  88. memset(dp[now],,sizeof dp[now]);
  89. for(int x=;x<=a;x++)for(int y=;y<=b;y++)for(int z=;z<=c;z++)
  90. {
  91. if(x>=num[j])dp[now][x][y][z]=(dp[now][x][y][z]+dp[pre][x-num[j]][y][z])%p;
  92. if(y>=num[j])dp[now][x][y][z]=(dp[now][x][y][z]+dp[pre][x][y-num[j]][z])%p;
  93. if(z>=num[j])dp[now][x][y][z]=(dp[now][x][y][z]+dp[pre][x][y][z-num[j]])%p;
  94. }
  95. }
  96. ans=(ans+dp[now][a][b][c])%p;
  97. }
  98. ans=ans*quick(m,p-,p)%p;
  99. printf("%lld\n",ans);
  100. return ;
  101. }
  102. /***********************
  103.  
  104. ***********************/

1004: [HNOI2008]Cards burnside定理的更多相关文章

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

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

  2. 1004: [HNOI2008]Cards - burnside + DP

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

  3. BZOJ 1004 HNOI2008 Cards Burnside引理

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

  4. bzoj1004 [HNOI2008]Cards Burnside定理+背包

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

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

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

  6. 【BZOJ 1004】 1004: [HNOI2008]Cards (置换、burnside引理)

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

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

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

  8. BZOJ 1004: [HNOI2008]Cards

    Description 给你一个序列,和m种可以使用多次的置换,用3种颜色染色,求方案数%p. Sol Burnside定理+背包. Burnside定理 \(N(G,\mathbb{C})=\fra ...

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

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

随机推荐

  1. POJO,简单的Java对象

    POJO = "Plain Ordinary Java Object",简单的Java对象,是为了避免和EJB混淆所创造的简称,是MartinFowler等发明的一个术语,用来表示 ...

  2. 用tophat和cufflinks分析RNAseq数据[转载]

    转自:http://blog.sciencenet.cn/home.php?mod=space&uid=635619&do=blog&id=884213 //今天看到一篇非常好 ...

  3. .htaccees什么鬼?怎么用?

    .htaccess文件全称Hypertext Access(超文本入口).提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作 ...

  4. FAQs on Android

    @1: Environment Setup Ubuntu 14.04  32bits 1. Call Requires API level 11 (current min is 8) Android. ...

  5. 编辑器——sublime

    在这里只介绍自己经常使用的编辑器sublime 第一:安装node插件[出处:http://www.bubuko.com/infodetail-798008.html] 1.下载Nodejs插件,下载 ...

  6. 03 linux命令的操作

    开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 使用快捷键切换到虚拟终端5,使用管理员身份登录, ...

  7. python3_time模块详解

    python提供的时间模块time是需要单独引入: 1.time.sleep(secs)# 推迟调用线程的运行,secs指的是秒 time.sleep(secs) 2.time.time():返回当前 ...

  8. 为MarS Board安装无线网卡Linux驱动

    玩了几天MarS Board,发现要了解Linux是如何工作的,从嵌入式开发板玩起最有效率.因为会遇到无数的问题和未知领域,然后在解决问题的过程中有深入了解Linux的机会.   为这块开发板专门买了 ...

  9. [pixhawk笔记]11-Windows下PX4代码查看

    由于项目需要做基于Simulink的PX4二次开发,在Windows下面做,所以需要在Windows下查看PX4的代码,故写该文档,记录环境安装和配置过程.按照该网页安装工具链:Windows Ins ...

  10. 20145301 《Java程序设计》第九周学习总结

    20145301 <Java程序设计>第八周学习总结 教材学习内容总结 整合数据库 JDBC JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作 ...