等价类计数问题首先要构造出群

首先,给出的洗牌法就相当于置换,

再加上置换(1)(2)(3)……(n),可以构成一个包含m+1个置换的置换群;

这里要解释一下构成置换群的四个条件

  1. 封闭性 任意两个置换相乘所得的置换还在群内 题目中已经给定保证任意多次洗牌都可用这m种洗牌法中的一种代替

  2. 结合性 显然置换相乘本身就满足结合律

  3. 单位元 存在一个单位元e是的a*e=a成立,显然置换(1)(2)(3)……(n)就是这样一个单位元

  4. 逆元   任意一个置换a都存在一个置换b使得a*b=e 这是有题目给定条件对每种洗牌法,都存在一种洗牌法使得能回到原状态。

这样置换群就弄出来了,然后就是根据Burnside引理,找出每个置换不动点的个数

每个置换可以拆成多个不相交的循环的积,不动点就要求每个循环内元素颜色相同

由于颜色存在数量限制,不能用polya求,只能用dp求出

最后注意求平均数设计到除法取模,我们还要求m+1的乘法逆元

 var s,r:array[..] of longint;
    f:array[..,..,..] of longint;
    ans,x,y,i,j,n,m,a,b,c,p,t:longint;
    v:array[..] of boolean; procedure exgcd(a,b:longint;var x,y:longint);
  var xx,yy:longint;
  begin
    if b= then
    begin
      x:=;
      y:=;
    end
    else begin
      exgcd(b,a mod b,x,y);
      xx:=x;
      yy:=y;
      x:=yy;
      y:=xx-a div b*yy;
    end;
  end; function calc(n:longint):longint;  
//f[i,j,k]表示到第i个循环,红色用了j次,蓝色用了k次,由于每个循环内颜色相同,所以绿色用的次数可以根据i,j,k算出
  var t,i,j,k:longint;
  begin
    f[,,]:=;
    t:=;
    for i:= to n do
    begin
      t:=t+s[i];
      for j:= to a do
        for k:= to b do
        begin
          f[i,j,k]:=;
          x:=t-j-k;
          if (x>c) then continue;
          if x< then break;
          if j>=s[i] then f[i,j,k]:=(f[i,j,k]+f[i-,j-,k]) mod p;  //要涂就一定要足够涂满循环内全部元素
          if k>=s[i] then f[i,j,k]:=(f[i,j,k]+f[i-,j,k-]) mod p;
          if x>=s[i] then f[i,j,k]:=(f[i,j,k]+f[i-,j,k]) mod p;
        end;
    end;
    exit(f[n,a,b]);
  end; begin
  readln(a,b,c,m,p);
  n:=a+b+c;
  for i:= to n do
    s[i]:=;
  ans:=calc(n);
  for i:= to m do
  begin
    for j:= to n do
      read(r[j]);
    fillchar(v,sizeof(v),false);
    fillchar(s,sizeof(s),);
    t:=;
    for j:= to n do
      if not v[j] then
      begin
        x:=j;
        inc(t);
        while not v[x] do
        begin
          v[x]:=true;
          inc(s[t]);  //统计循环规模
          x:=r[x];
        end;
      end;
    ans:=(ans+calc(t)) mod p;  
  end;
  x:=;
  y:=;
  exgcd(m+,p,x,y);
  writeln(ans*(x+p) mod p);  //注意通过扩展欧几里得求出的乘法逆元可能是负数
end.

bzoj1004的更多相关文章

  1. 【bzoj1004】 HNOI2008—Cards

    http://www.lydsy.com/JudgeOnline/problem.php?id=1004 (题目链接) 题意 n张卡片,染成3种颜色,每种颜色只能染固定张数.给出一些洗牌方案,问染色方 ...

  2. 【BZOJ1004】Cards(组合数学,Burnside引理)

    [BZOJ1004]Cards(组合数学,Burnside引理) 题面 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Su ...

  3. BZOJ1004 HNOI2008Cards(Burnside引理+动态规划)

    直接给了一个置换群(当然要自己手动加上不洗牌的情况).考虑求不动点数量即可.对于一个置换,求出所有循环的长度,然后设f[i][x][y]为给前i个循环着色后,用了x张红色卡片.y张绿色卡片的方案数,d ...

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

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

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

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

  6. BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】

    题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...

  7. bzoj1004 [HNOI2008]Cards 置换群+背包

    [bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...

  8. BZOJ1004: [HNOI2008]Cards

    三维01背包算出在每一个置换下不变的染色方案数,Burnside引理计算答案. PS:数据太水所以只算恒等置换也是可以过的. #include<bits/stdc++.h> using n ...

  9. BZOJ1004 [HNOI2008]Cards(Polya计数)

    枚举每个置换,求在每个置换下着色不变的方法数,先求出每个循环的大小,再动态规划求得使用给定的颜色时对应的方法数. dp[i][j][k]表示处理到当前圈时R,B,G使用量为i,j,k时的方法数,背包思 ...

  10. 【BZOJ1004】【HNOI20008】cards

    看黄学长的代码才写出来的,sro_hzwer_orz 原题: 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给 ...

随机推荐

  1. C++编程注意事项

    1.所有成员变量在构造函数中进行初始化操作,如指针赋值为空,bool赋值为FALSE(默认为TRUE); 2.构造函数与析构函数配对出现,执行反向操作,保证执行析构之后,没有遗留问题存在: 3.如果需 ...

  2. 推荐几款提高.net编程效率的辅助工具

    1.Resharper ReSharper是一个JetBrains公司出品的著名的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE.它包括一系列丰富的能大大增加 ...

  3. javascript 去除字符串中重复字符

    /** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...

  4. Myeclipse配置mybatis的xml自动提示

    关于mapper的xml的文件的自动提示 mapper头: <?xml version="1.0" encoding="UTF-8"?><!D ...

  5. Codevs 1217 借教室 2012年NOIP全国联赛提高组

    1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...

  6. struts2初印象

    第一次写这么正式的文章,如果写的不好的地方,请指出. 今天玩了一下struts2,不过貌似是我被他玩了.简要笔记如下: 一.配置struts2(在eclipse Helios版本下) (1)先创建一个 ...

  7. IE 动态绑定click事件

    //必须先清除原有的事件 $(dom).attr("onclick", ""); //再重新绑定新的事件 $(dom).bind("click&quo ...

  8. fedora 20 install skype

    http://www.if-not-true-then-false.com/2012/install-skype-on-fedora-centos-red-hat-rhel-scientific-li ...

  9. OpenCV2学习笔记02:MSVC2013搭建OpenCV开发环境

    我这里编译的库是通过手动编译的.只是需要注意的是,手动编译一般会产生大量的文件,差不多7个多G的样子,实在是有点浪费硬盘存储呀,其实我们可以删除掉没有用的东西.因为我们在编译的时候指定了一个目录比如我 ...

  10. PYTHON 获取机器硬件信息及状态

    #!/usr/bin/env python # encoding: utf-8 from optparse import OptionParser import os import re import ...