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

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

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

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

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

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

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

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

时间: 2024-10-12 20:08:15

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

bzoj1004: [HNOI2008]Cards Burnside引理+01背包

三维01背包算出在每一个置换下不变的染色方案数,Burnside引理计算答案. PS:数据太水所以只算恒等置换也是可以过的. #include<bits/stdc++.h> using namespace std; int n,m,p,x,y,z; bool u[61]; int f[21][21][21],s[61],v[61]; int power(int u,int v){ int d=1; for(;v;v>>=1){ if(v&1) d=d*u%p; u=u*u%

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

题目描述 用三种颜色染一个长度为 $n=Sr+Sb+Sg$ 序列,要求三种颜色分别有 $Sr,Sb,Sg$ 个.给出 $m$ 个置换,保证这 $m$ 个置换和置换 ${1,2,3,...,n\choose 1,2,3,...,n}$ 构成一个置换群,求置换后不同构的序列个数模 $p$ . $0\le Sr,Sb,Sg\le 20,0\le m\le 60,m+1\le p\le 100$ ,$p$ 是质数. 输入 第一行输入 5 个整数:Sr,Sb,Sg,m,p(m<=60,m+1<p<

【BZOJ1004】[HNOI2008]Cards Burnside引理

[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定理的推导过程. 如果

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

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b 属于 G, a * b 属于 G 2)结合律, a * b * c = a * (b * c) 3)单位元,在 G 中存在一个单位元 e ,使得对于 G 中任意的 a , a * e = e * a = a 4)逆元, 对

BZOJ 1004 HNOI2008 Cards Burnside引理

题目大意:给定n张卡牌和m个置换,求等价类个数 数据保证这m个置换加上自身置换后构成一个置换群 BZOJ坑爹0.0 这么重要的条件不给出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都快啃吐了0.0 Burnside引理:一个置换群下的等价类个数等于所有置换的不动点个数的平均值 没有接触过群论的建议去啃白书-- 网上的东西看不懂的 最后那个除法要用乘法逆元 我懒得写EXGCD写了费马小定理0.0 #include<cstdio> #include<cstri

bzoj 1004 1004: [HNOI2008]Cards burnside定理

1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1668  Solved: 978[Submit][Status] Description 小 春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答 案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最

[bzoj1004][HNOI2008][Cards] (置换群+Burnside引理+动态规划)

Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.Sun发现这个问题有点难度,决

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

题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b 属于 G, a * b 属于 G 2)结合律, a * b * c = a * (b * c) 3)单位元,在 G 中存在一个单位元 e ,使得对于 G 中任意的 a , a * e = e * a = a 4)逆元, 对于 G 中任意的 a ,在 G 中存在 b , 使得 a * b = e ,

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

Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.Sun发现这个问题有点难度,决