对于burnside引理需要枚举染色,这道题属于burnside的一种简单求解的方法,就是polya,我们可以使每一种置换中的循环节中的元素的颜色都相同,那么这样的话就可以直接DP了,我们可以将m个置换单独考虑,处理出当前置换中各个循环节,那么用w[aa][bb][cc]表示在使用了aa个颜色1,bb个颜色2,cc个颜色3时,我们的轨道数,那么我们可以通过背包来累加答案,w[aa][bb][cc]+=w[aa-b[i]][bb][cc] w[aa][bb][cc]+=w[aa][bb-b[i]][cc] w[aa][bb][cc]+=w[aa-b[i]][bb][cc-b[i]]。

  

/**************************************************************
    Problem: 1004
    User: BLADEVIL
    Language: C++
    Result: Accepted
    Time:84 ms
    Memory:868 kb
****************************************************************/
 
//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 70
 
using namespace std;
 
int sa,sb,sc,m,n,p,ans;
int a[maxn],b[maxn],w[][][],flag[maxn];
 
int mi(int a,int k) {
    int ans=;
    while (k) {
        if (k&) ans=(ans*a)%p;
        a=(a*a)%p;
        k>>=;
    }
    return ans;
}
 
int main() {
    scanf("%d%d%d%d%d",&sa,&sb,&sc,&m,&p); n=sa+sb+sc;
    ans=;
    for (int i=;i<=n;i++) ans=(ans*i)%p;
    //printf("%d\n",ans);
    //printf("|%d\n",mi(3,3));
    for (int i=;i<=sa;i++) ans=(ans*mi(i,p-))%p;
    for (int i=;i<=sb;i++) ans=(ans*mi(i,p-))%p;
    for (int i=;i<=sc;i++) ans=(ans*mi(i,p-))%p;
    //printf("%d\n",ans);
    int cur=m;
    while (cur--) {
        for (int i=;i<=n;i++) scanf("%d",&a[i]);
        memset(flag,,sizeof flag);
        memset(b,,sizeof b);
        memset(w,,sizeof w);
        for (int i=;i<=n;i++) if (!flag[i]) {
            b[++b[]]=; flag[i]=;
            for (int cur=a[i];cur!=i;cur=a[cur]) b[b[]]++,flag[cur]=;
        }
        //for (int i=1;i<=b[0];i++) printf("%d ",b[i]); printf("\n");
        w[][][]=;
        for (int i=;i<=b[];i++)
            for (int aa=sa;aa;aa--)
                for (int bb=sb;bb;bb--)
                    for (int cc=sc;cc;cc--) {
                        if (aa>=b[i]) w[aa][bb][cc]=(w[aa][bb][cc]+w[aa-b[i]][bb][cc])%p;
                        if (bb>=b[i]) w[aa][bb][cc]=(w[aa][bb][cc]+w[aa][bb-b[i]][cc])%p;
                        if (cc>=b[i]) w[aa][bb][cc]=(w[aa][bb][cc]+w[aa][bb][cc-b[i]])%p;
                    }
        ans=(ans+w[sa][sb][sc])%p;
        //printf("%d\n",ans);  
    }
    ans=(ans*mi(m+,p-))%p;
    printf("%d\n",ans);
    return ;
}

bzoj 1004 burnside 引理+DP的更多相关文章

  1. [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】

    题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...

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

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1004 题意:三种颜色的扑克牌各有Sr,Sb,Sg张.给出m种置换.两种染色方案在某种置换 ...

  3. [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...

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

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

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

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

  6. [BZOJ1547]周末晚会:Burnside引理+DP

    分析 Attention!这道题的模数是\(1e8+7\). 注意到循环同构会被认为是同一种方案,我们可以把顺时针旋转每个人的位置作为置换,容易发现这些置换一定会形成一个置换群,于是题目所求的所有合法 ...

  7. UVA11540 Sultan's Chandelier Burnside 引理 + DP

    题目传送门 https://vjudge.net/problem/UVA-11540 https://uva.onlinejudge.org/index.php?option=com_onlineju ...

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

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

  9. BZOJ 1004 HNOI2008 Cards Burnside引理

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

随机推荐

  1. TCP系列15—重传—5、Linux中RTO的计算

    之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法.在linux中维护了srtt.mdev.mdev_max.rttvar.rtt_seq几个状态变量用来计算 ...

  2. grid++json页面数据传入

    最近遇到一个问题,就是要用Grid++做页面数据报表打印,但是翻了Grid++文档就是没有直接从页面上传数据的,都是要加载txt文档,填写txt文档的url.自己尝试直接页面上传JSON数据到Grid ...

  3. 敏捷冲刺Day1

    前言: 之前的各种对教务系统的分析,再加上我们两三天的讨论和一个小时的站立会议,我们做出最终的决定.--我们决定换个项目主题,将原来的教务辅助系统换成现在的校园帮帮帮服务,并在之后会将完成后的计划书附 ...

  4. Flink中的数据传输与背压

    一图道尽心酸: 大的原理,上游的task产生数据后,会写在本地的缓存中,然后通知JM自己的数据已经好了,JM通知下游的Task去拉取数据,下游的Task然后去上游的Task拉取数据,形成链条. 但是在 ...

  5. java zip 压缩与解压

    java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java. ...

  6. wpf拖拽

    简单拖拽的实现是,实现源控件的MouseDown事件,和目标控件Drop事件.调用DragDrop.DoDragDrop()以启动拖放操作,DragDrop.DoDragDrop()函数接受三个参数: ...

  7. BZOJ4028 HEOI2015公约数数列(分块)

    前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将 ...

  8. InnoDB实现MVCC原理

    ​ MVCC(Multi-Version Concurrent Control),即多版本并发控制,通过保存数据在某个时间点的快照来实现,因此每个读操作都会看到一个一致性的视图,并且可以实现非阻塞的读 ...

  9. Python列表去重的三种方法

    1. 列表去重 li = [] for item in my_list: if item not in li: li.append(item) 2.集合去重 list(set(my_list)) 3. ...

  10. [SP8372-TSUM]Triple Sums

    题面在这里 description 某\(B\)姓\(OJ\)权限题 给出\(n\)个正整数\(a[i]\),求\(i<j<k\)且\(S=a[i]+a[j]+a[k]\)的三元组\((i ...