bzoj 1004 1004: [HNOI2008]Cards burnside定理

1004: [HNOI2008]Cards

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1668  Solved: 978
[Submit][Status]

Description


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

Input

第一行输入 5 个整数:Sr,Sb,Sg,m,p(m<=60,m+1<p<100)。n=Sr+Sb+Sg。接下来 m 行,每行描述
一种洗牌法,每行有 n 个用空格隔开的整数 X1X2...Xn,恰为 1 到 n 的一个排列,表示使用这种洗牌法,
第 i位变为原来的 Xi位的牌。输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种
洗牌法,都存在一种洗牌法使得能回到原状态。

100%数据满足 Max{Sr,Sb,Sg}<=20。

Output

不同染法除以P的余数

Sample Input

1 1 1 2 7
2 3 1
3 1 2

Sample Output

2

HINT

有2 种本质上不同的染色法RGB 和RBG,使用洗牌法231 一次可得GBR 和BGR,使用洗牌法312 一次 可得BRG 和GRB。

都快把burnside忘掉了:

    Burnside:真正意义上不变的染色方案数=Σ(每种置换下不变的染色方案数)/(置换总数)

题目中“输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替”太让人省心了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100
int num[MAXN],tot[MAXN];
bool vis[MAXN];
int f[21][21][21];
int mod;
int a,b,c;
void deal(int &x,int y)
{
        x+=y;
        if (x>=mod)x%=mod;
}
int pow_mod(int x,int y)
{
        int ret=1;
        while (y)
        {
                if (y&1)ret=ret*x%mod;
                x=x*x%mod;
                y>>=1;
        }
        return ret;
}
int main()
{
        //freopen("input.txt","r",stdin);
        int i,j,k,n,m,x,y,z;
        int k1,k2,k3;
        int a,b,c;
        scanf("%d%d%d%d%d",&a,&b,&c,&m,&mod);
        n=a+b+c;
        int cnt;
        int sum=0;
        for (i=0;i<=m;i++)
        {
                if (i==m)
                {
                        for (j=1;j<=n;j++)
                        {
                                num[j]=j;
                                vis[j]=0;
                        }
                }else
                {
                        for (j=1;j<=n;j++)
                        {
                                scanf("%d",&num[j]);
                                vis[j]=0;
                        }
                }
                cnt=0;
                for (j=1;j<=n;j++)
                {
                        if (!vis[j])
                        {
                                x=j;
                                cnt++;
                                y=0;
                                while (!vis[x])
                                {
                                        vis[x]=cnt;
                                        y++;
                                        x=num[x];
                                }
                                tot[cnt]=y;
                        }
                }
                memset(f,0,sizeof(f));
                f[a][b][c]=1;
                for (j=1;j<=cnt;j++)
                {
                        for (k1=0;k1<=a;k1++)
                        {
                                for (k2=0;k2<=b;k2++)
                                {
                                        for (k3=0;k3<=c;k3++)
                                        {
                                                if (k1+tot[j]<=a)deal(f[k1][k2][k3],f[k1+tot[j]][k2][k3]);
                                                if (k2+tot[j]<=b)deal(f[k1][k2][k3],f[k1][k2+tot[j]][k3]);
                                                if (k3+tot[j]<=c)deal(f[k1][k2][k3],f[k1][k2][k3+tot[j]]);
                                        }
                                }
                        }
                }
                deal(sum,f[0][0][0]);
        }
        sum*=pow_mod(m+1,mod-2);
        sum%=mod;
        printf("%d\n",sum);
}

bzoj 1004 1004: [HNOI2008]Cards burnside定理

时间: 2024-10-16 04:40:50

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

1004: [HNOI2008]Cards burnside定理

https://www.lydsy.com/JudgeOnline/problem.php?id=1004 输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态.(保证置换的完备性) 要考虑1,2,3...n这个置换,然后算出每种置换的方案数,除上总置换数m+1,就是答案,因为有取模,所以需要算逆元,然后对与一种置换来说总的情况数可以用dp来计算,因为每一个置换群只能涂成一种颜色,然后我们需要满足涂的颜色种数满足条件,dp[i][j][k]维

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

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 HNOI 2008 Cards Burnside引理

题目大意:给出一个置换群,求有多少种本质不同的染色方案. 思路:Burnside引理:置换群的等价类数目=所有置换的不动点数目的平均值. 有了这个引理,我们只需要求出所有不动点的数目求一个平均值就可以的到等价类的数目了. 要使一种染色的方案在一种置换的意义下是不动点,需要让这个置换的每个循环节中的颜色都相同.先求出所有置换的循环,然后用一个背包就可以初解了.最后乘法逆元搞一下除法. CODE: #define _CRT_SECURE_NO_DEPRECATE #include <cstdio>

[BZOJ1004] [HNOI2008] Cards (Polya定理)

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

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

题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染色方案数就是每种置换的不变元素的个数的平均数. 求每种置换的不变元素的个数用背包解决.因为置换之后元素不变,所以对于每个循环节我们要染一个颜色,于是先处理出循环节作为背包中的"物体",然后一个三维背包解决.f[i][j][k]的i j k表示三种颜色分别还可以染多少次. 除m%p用费马小定

【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引理+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%

BZOJ 1004: [HNOI2008]Cards Polya计数+DP

Polya计数+dp求满足对应循环的不动点有几个 1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2046  Solved: 1212 [Submit][Status][Discuss] Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,S