polya计数回顾
2015-08-15 23:40
288 查看
burnside引理
设$G={g_1,g_2...g_k}$是[1,n]上的置换群,令$c(g_i)$表示置换$g_i$下不动点的个数,那么G将[1,n]划分为等价类>的个数是:
\[
l = \frac{1}{|G|}{\sum_{j=1}^{|G|}{c(g_i)}}
\]
即是说,等价类个数等于不动点个数的均值。
如果存在$g_i$将$g_i(a)->b$那么我们就说观测到a和b等价。换句话说,我们看到的a和b是同一个东西。
polya定理
设$G={g_1,g_2...g_|G|}$是[1,n]上的置换群,令$C(g_i)$表示置换$g_i$下循环节的个数,先用m个颜色对[1,n]着色,那么在G作用下,[1,n]的不同着色方案数为:
\[
l = \frac{1}{|G|}{\sum_{j=1}^{|G|}m^{C(g_i)}}
\]
polya定理是burnside的特例。
需要注意的是,burnside算的是[1,n]这n个数的不同等价类的个数;polya算的是$m^n$个方案数中不同等价类的个数。因此,burnside中的[1,n]是计数对象,而polya中的方案数是计数对象。
burnside中的g直接作用于计数对象[1,n];而polya中的g虽然也作用于[1,n],但[1,n]不是计数对象,方案数才是,但是g通过作用到[1,n]间接作用到方案数上面。
比如n=4,g=(1 2 3)(4),着色方案为f=(a b c d),那么g(f) = (c a b d)
两式对比,容易发现$m^{C(g_i)}$是burnside中的不动点数。不动点是自己映射到自己,即g(f) = f.对于上例就是(c a b d) = (a b c d),于是有c = a, a = b, b = c, d = d。因此如果方案f是不动点,那么f的循环节内的点的颜色必须一致。对于循环节为$C(g_i)$的置换,其不动点个数为$m^{C(g_i)}$
顺便上一题巩固一下
[HNOI2008]Cards
这里不能直接套用polya,因为每种颜色的使用量是有限制的,因此考虑用burnside计算。对于置换g,因为同一循环节里面只能用同一种颜色,因此我们统计出g的第i个循环节里面有ci个数。然后我们用这些数dp就可以了。
dp[i][r][g][b]表示前i个循环节,用r中r色,g中g色,b种b色着色的方案数:
那么dp[i][r][g][b] = dp[i][r-ci][g][b]+dp[i][r][g][b-ci]+dp[i][r][g-ci][b]。然后就没有然后了。
设$G={g_1,g_2...g_k}$是[1,n]上的置换群,令$c(g_i)$表示置换$g_i$下不动点的个数,那么G将[1,n]划分为等价类>的个数是:
\[
l = \frac{1}{|G|}{\sum_{j=1}^{|G|}{c(g_i)}}
\]
即是说,等价类个数等于不动点个数的均值。
如果存在$g_i$将$g_i(a)->b$那么我们就说观测到a和b等价。换句话说,我们看到的a和b是同一个东西。
polya定理
设$G={g_1,g_2...g_|G|}$是[1,n]上的置换群,令$C(g_i)$表示置换$g_i$下循环节的个数,先用m个颜色对[1,n]着色,那么在G作用下,[1,n]的不同着色方案数为:
\[
l = \frac{1}{|G|}{\sum_{j=1}^{|G|}m^{C(g_i)}}
\]
polya定理是burnside的特例。
需要注意的是,burnside算的是[1,n]这n个数的不同等价类的个数;polya算的是$m^n$个方案数中不同等价类的个数。因此,burnside中的[1,n]是计数对象,而polya中的方案数是计数对象。
burnside中的g直接作用于计数对象[1,n];而polya中的g虽然也作用于[1,n],但[1,n]不是计数对象,方案数才是,但是g通过作用到[1,n]间接作用到方案数上面。
比如n=4,g=(1 2 3)(4),着色方案为f=(a b c d),那么g(f) = (c a b d)
两式对比,容易发现$m^{C(g_i)}$是burnside中的不动点数。不动点是自己映射到自己,即g(f) = f.对于上例就是(c a b d) = (a b c d),于是有c = a, a = b, b = c, d = d。因此如果方案f是不动点,那么f的循环节内的点的颜色必须一致。对于循环节为$C(g_i)$的置换,其不动点个数为$m^{C(g_i)}$
顺便上一题巩固一下
[HNOI2008]Cards
这里不能直接套用polya,因为每种颜色的使用量是有限制的,因此考虑用burnside计算。对于置换g,因为同一循环节里面只能用同一种颜色,因此我们统计出g的第i个循环节里面有ci个数。然后我们用这些数dp就可以了。
dp[i][r][g][b]表示前i个循环节,用r中r色,g中g色,b种b色着色的方案数:
那么dp[i][r][g][b] = dp[i][r-ci][g][b]+dp[i][r][g][b-ci]+dp[i][r][g-ci][b]。然后就没有然后了。
/************************************************************** Problem: 1004 User: 63116021 Language: C++ Result: Accepted Time:120 ms Memory:3616 kb ****************************************************************/ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #define clr(A) memset(A,0,sizeof(A)) using namespace std; const int MM = 10000; int r,b,g,m,p; int fg = 0; typedef struct GG{ int x,y; GG(int _x,int _y){ x = _x,y = _y; } }G; G Ext_gcd(int a,int b) { if(b==0) return G(1,0); G tmp = Ext_gcd(b,a%b); return G(tmp.y,tmp.x-a/b*tmp.y); } int getcir(int a[],int nn) { int hash[nn+3]; int B[nn+2]; clr(hash); int res = 0; for(int i = 1;i<=nn;i++) if(!hash[i]) { B[++res] = 1; hash[i] = 1; int tmp = a[i]; while(tmp!=i) { hash[tmp] = 1,B[res]++,tmp = a[tmp]; } } int F[res+2][b+2][r+2][g+2]; clr(F); F[0][0][0][0] = 1; for(int i = 1;i<=res;i++) for(int sb = 0;sb<=b;sb++) for(int sr = 0;sr<=r;sr++) for(int sg = 0;sg<=g;sg++) //if(sb+sr+sg>=B[i]) { if(sb>=B[i]) F[i][sb][sr][sg] += F[i-1][sb-B[i]][sr][sg]; if(sr>=B[i]) F[i][sb][sr][sg] += F[i-1][sb][sr-B[i]][sg]; if(sg>=B[i]) F[i][sb][sr][sg] += F[i-1][sb][sr][sg-B[i]]; F[i][sb][sr][sg] %= p; } if(res == nn) fg = 1; return F[res][b][r][g]; } int main() { //freopen("Pr_temp.in","r",stdin); scanf("%d%d%d%d%d",&r,&b,&g,&m,&p); int n = r+b+g; int A[n+2]; int ans = 0; for(int i = 1;i<=m;i++) { for(int j = 1;j<=n;j++) scanf("%d",A+j); ans = (ans+getcir(A,n)) % p; } if(!fg){ for(int i = 1;i<=n;i++) A[i] = i; ans = (ans+getcir(A,n)) % p; m++; } G Gg = Ext_gcd(m,p); int Inv = (Gg.x+p) % p; printf("%d\n",Inv*ans%p); return 0; }
相关文章推荐
- [BZOJ1004][HNOI2008][Burnside引理][DP]Cards
- POJ2154-Daze polya计数法优化
- poj 2154 Color
- HDU-4633 poyla计数
- Necklace of Beads
- Let it Bead
- Pólya定理初探
- POJ1286,2409——Let it Bead,Necklace of Beads( Pólya定理)
- POJ2154——Color(Polya定理+筛素数+欧拉函数)
- 蓝桥杯 结果填空 正六面体染色 Burnside引理
- POLYA合集
- POLYA合集 II
- Burnside引理和Polya定理 & [bzoj 1004] [HNOI2008]Cards:Burnside引理,动态规划
- UVA11255 necklace (polya定理)
- 【等价的穿越】Burnside引理&Pólya计数法
- Bzoj1004 [HNOI2008]Cards
- 日常训练 20170606 魔法手镯
- HDU-3923-Invoker
- Polya计数
- hdu2481 Toy