2013-team4/code/combinatorics-formula
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
Burnside's Theorem
{{{
X为一个置换群,C为一个染色的集合,需要满足C在X作用下封闭。
此时不同染色数为N(G,C)=sigma(|C(f)|)/|G|, f∈G
C(f)表示在f置换下,C中元素c使满足f(c)==c的c的个数。
}}}
Dehedral Group Dn of order 2n
{{{
置换ρi,中的循环数#(ρk) = gcd(i,n)
并且每个环的长度都为n/gcd(i,n)
具有环数为k的置换,(k|n)
有φ(n/k)种。
(欧拉函数)
}}}
代码实现
{{{
//将calc(i)改成需要的函数用以计算
//复杂度sqrt(n)*O(calc)
int polya(int n){
int res = 0;
for(int i = 1; i * i <= n; i ++){
if (n % i) continue;
int j = n / i;
res = (res + (LL)calc(i) * euler(j)) % MOD;
if (j!=i) res = (res + (LL)calc(j) * euler(i)) % MOD;
}
res = res * (LL) inv(n) % MOD;
return res;
}
}}}
Burnside's Theorem
X为一个置换群,C为一个染色的集合,需要满足C在X作用下封闭。
此时不同染色数为N(G,C)=sigma(|C(f)|)/|G|, f∈G
C(f)表示在f置换下,C中元素c使满足f(c)==c的c的个数。
Dehedral Group Dn of order 2n
置换ρi,中的循环数#(ρk) = gcd(i,n)
并且每个环的长度都为n/gcd(i,n)
具有环数为k的置换,(k|n)
有φ(n/k)种。
(欧拉函数)
代码实现
//将calc(i)改成需要的函数用以计算
//复杂度sqrt(n)*O(calc)
int polya(int n){
int res = 0;
for(int i = 1; i * i <= n; i ++){
if (n % i) continue;
int j = n / i;
res = (res + (LL)calc(i) * euler(j)) % MOD;
if (j!=i) res = (res + (LL)calc(j) * euler(i)) % MOD;
}
res = res * (LL) inv(n) % MOD;
return res;
}