[BZOJ1004]Cards

  ploya定理+乘法逆元

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 65
 4 #define maxs 25
 5 int sr,sb,sg,n,m,p;
 6 int a[maxn][maxn],f[maxs][maxs][maxs],vis[maxn],cal[maxn];
 7
 8 int dp(int x){
 9     memset(vis,0,sizeof(vis));
10     memset(f,0,sizeof(f));
11     int cc=0;
12     for(int i=1;i<=n;i++){
13         if(!vis[i]){
14             vis[i]=1;
15             cal[++cc]=1;
16             int ii=i;
17             while(!vis[a[x][ii]]){
18                 vis[a[x][ii]]=1;
19                 cal[cc]++;
20                 ii=a[x][ii];
21             }
22         }
23     }
24     f[0][0][0]=1;
25     for(int t=1;t<=cc;t++)
26         for(int i=sr;i>=0;i--)
27             for(int j=sb;j>=0;j--)
28                 for(int k=sg;k>=0;k--){
29                     if(i>=cal[t])f[i][j][k]=(f[i][j][k]+f[i-cal[t]][j][k])%p;
30                     if(j>=cal[t])f[i][j][k]=(f[i][j][k]+f[i][j-cal[t]][k])%p;
31                     if(k>=cal[t])f[i][j][k]=(f[i][j][k]+f[i][j][k-cal[t]])%p;
32                 }
33     return f[sr][sb][sg];
34 }
35 int main(){
36     scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&p);
37     n=sr+sb+sg;
38     for(int i=1;i<=m;i++)
39         for(int j=1;j<=n;j++)
40             scanf("%d",&a[i][j]);
41     m++;
42     for(int i=1;i<=n;i++)a[m][i]=i;
43     int ans=0;
44     for(int i=1;i<=m;i++)
45         ans=(ans+dp(i))%p;
46     for(int i=1;i<=p-2;i++)
47         ans=(ans*m)%p;
48     printf("%d\n",ans);
49     return 0;
50 }

时间: 2024-10-29 04:01:07

[BZOJ1004]Cards的相关文章

BZOJ1004 [HNOI2008]Cards

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ1004 正解:$Burnside$引理 解题报告: 经典$Burnside$引理题. 考虑一般的$Burnside$引理题都是直接求出一阶循环的个数,然后对于置换个数取平均数. 但是有颜色限制,所以我们不能直接算. 而因为一个洗牌方案相

【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

http://www.lydsy.com/JudgeOnline/problem.php?id=1004 (题目链接) 题意 n张卡片,染成3种颜色,每种颜色只能染固定张数.给出一些洗牌方案,问染色方案数. Solution Burnside引理. 左转题解:LCF 代码 // bzoj1004 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #includ

【bzoj1004】[HNOI2008]Cards

1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2928  Solved: 1754[Submit][Status][Discuss] 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发现这个问题有点难度,决

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

题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i)\)为置换\(i\)下不变的方案数,那么 \[L = \frac{1}{m}\sum\limits_{i = 1}^{m} f(i)\] 在一个置换下一个方案不变,当且仅当该置换的任意一个循环节内部颜色相同 记循环节个数为\(c_i\),色数为\(k\)且不限使用,那么该置换下不变的方案数为 \[

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

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

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](HNOI 2008) Cards

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