数数你的同分异构(完善中)

Posted HMSF0123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数数你的同分异构(完善中)相关的知识,希望对你有一定的参考价值。

Part 0 群


§ 0.0 群的基本定义

一个集合 \\(S\\),再加上一个二元运算 \\(\\times\\) .(不一定是真的乘法)

如果满足下面的这条性质:

  • \\(\\forall x,y\\in S,x\\times y\\in S\\)(封闭律)

我们称这个集合和这个运算的整体 \\((S,\\times)\\) 构成一个代数系统

如果进一步满足这个性质:

  • \\(\\forall x,y,z\\in S,(x\\times y)\\times z = x\\times(y\\times z)\\)(结合律)

那么我们还能把这个整体称作一个半群

如果进两步满足这个性质:

  • \\(\\exists\\, e\\in S,\\forall\\, x\\in S,e\\times x = x\\times e = x\\)(单位元)

注意要对左乘和右乘同时满足这个性质。

那么这个整体可以叫做幺半群

如果进三步满足这个性质:

  • \\(\\forall\\, x\\in S,\\exists\\, y\\in S,x\\times y =y\\times x = e\\)(逆元)

这里也要同时对左右成立。

那么这个整体就是一个了!

如果在此之上还满足 \\(\\forall\\, x,y\\in S,x\\times y =y\\times x\\) (交换律),那么这个群叫做交换群,或者阿贝尔群。

§ 0.1 置换群

有一些元素 \\(a_1,a_2,\\cdots,a_n\\),定义他们的一个置换为这样的一个映射:

\\[\\beginpmatrix a_p_1 & a_p_2 & a_p_3 &\\cdots&a_p_n \\\\ a_1 & a_2 & a_3 &\\cdots&a_n \\\\ \\endpmatrix \\]

其中 \\(p_1\\cdots n\\)\\(1\\sim n\\) 的一个排列。

当然,任意交换某些列之后得到的置换和原先的置换是等价的。

两个置换是可以复合的,其定义如下:

\\[\\begingathered \\beginpmatrix a_p_1 & a_p_2 & a_p_3 &\\cdots&a_p_n \\\\ a_1 & a_2 & a_3 &\\cdots&a_n \\\\ \\endpmatrix \\circ \\beginpmatrix a_1 & a_2 & a_3 &\\cdots&a_n \\\\ a_q_1 & a_q_2 & a_q_3 &\\cdots&a_q_n \\\\ \\endpmatrix =\\\\ \\beginpmatrix a_p_1 & a_p_2 & a_p_3 &\\cdots&a_p_n \\\\ a_q_1 & a_q_2 & a_q_3 &\\cdots&a_q_n \\\\ \\endpmatrix \\endgathered \\]

\\(n\\) 个元素的置换的集合再加上置换的复合操作可以构成一个群,读者自证不难。

定义循环置换为一种特殊的置换,满足它可以被写成如下的形式:

\\[\\beginpmatrix a_p_1 & a_p_2 &\\cdots&a_p_m & a_q_1 &\\cdots& a_q_n-m \\\\ a_p_2 & a_p_3 &\\cdots&a_p_1 & a_q_1 &\\cdots& a_q_n-m \\\\ \\endpmatrix \\]

其中 \\(p,q\\) 两个序列给出 \\(1\\sim n\\) 的一个划分。

如果把置换视作图,由一列中上方向下方连边,那么易得到每个点恰有一个出度和一个入度,因此而我们知道这个图是由若干个不相交的环构成的。换句话说,任意一个置换都可以拆成若干循环置换的复合。

§ 0.2 子群与陪集

既然集合有子集,那么群有没有子群呢?

当然有了,子群定义为:有一个群 \\(G=(S,\\times)\\),若存在 \\(T\\subseteq S\\),且 \\((T,\\times)\\) 是一个群,那么称 \\(H=(T,\\times)\\)\\(G\\) 的子群。

可以看到,一个子群必定含有大群的单位元。进一步地,我们发现,如果想要证明一个子集 \\(T\\) 和运算 \\(\\times\\) 构成一个子群,只需要证明该群具有封闭律、每个元素都有逆元即可。

能不能进一步简化证明呢?我们考虑上面三个要证的东西的实质:

\\[\\begingathered e\\in T\\\\ \\forall\\, x\\in T,x^-1\\in T \\\\ \\forall x,y\\in T,x\\times y\\in T \\endgathered \\]

我们发现,第二个条件比第一个要强一些,满足了他一定会满足第一条,所以把第一条省略掉。

\\[\\begingathered \\forall\\, x\\in T,x^-1\\in T \\\\ \\forall x,y\\in T,x\\times y\\in T \\endgathered \\]

然后这两条条件可以综合为下面的这一条:

\\[\\forall x,y\\in T,x\\times y^-1\\in T \\]

这是子群检验定理,是一个充要条件。

接下来是另一个概念:陪集

陪集的由来:考虑四边二面体群 \\(D_4\\)(有标号、有正反正方形在空间中的摆放方式群),这个正方形经过一次翻转操作之后,如果不翻转回来,那么它将永远无法回到正面朝上的四个状态。

陪集正是为了表征这种性质而发明。

定义 \\(G\\) 的一个子群 \\(H\\) 对于元素 \\(g\\in G\\) 的左、右陪集分别为:

\\[\\beginalign* gH = \\g\\times h|h\\in H\\ \\\\ Hg = \\h\\times g|h\\in H\\ \\\\ \\endalign* \\]

性质 1:对于某个子群 \\(H\\) 的两个陪集 \\(fH,gH\\),它们要么完全不交,要么完全相同。

证明:假设存在 \\(h_1\\),使得 \\(gh_1\\in fH\\),根据陪集的定义,一定存在 \\(x\\in H\\),使得 \\(gh_1 = fx\\) .

那么对于任意的 \\(h_2\\in H\\),有:

\\[gh_2 = gh_1 h_1^-1 h_2 = (gh_1)h_1^-1 h_2 = fxh_1^-1h_2 \\]

根据子群的封闭律、逆元律,有 \\(xh_1^-1h_2 = h\'\\in H\\),即 \\(gh_2 = fh\' \\in H\\) .

证毕。

性质 2:一个陪集是一个子群当且仅当它与原子群相等。

证明:考虑一个子群必须含有单位元,根据上一性质易证。

性质 3:任意一个陪集的大小一定与原子群相等。

证明:假设存在不相同的 \\(h_1,h_2\\),使得 \\(gh_1 = gh_2\\),那么根据逆元律,有 \\(h_1=h_2\\),与题设矛盾。因此不会有两个元素被映射到同一个位置,陪集不会比原子群更小。

同时陪集显然不会比原子群更大。

性质 4(拉格朗日定理):\\(G\\) 的任意一个子群 \\(H\\) 的大小一定整除 \\(G\\) 的大小。

证明:考虑 \\(H\\) 的所有左陪集或右陪集,易证。

用记号 \\([G:H]\\) 表示 \\(H\\) 的不相交的陪集的数目。

§ 0.3 轨道与稳定子

有一个群 \\(G(S,\\circ)\\),和一个集合 \\(X\\),现在 \\(G\\) 中有一些可复合的变换,变换的作用对象是 \\(X\\) 中的任意一个元素 \\(x\\),那么我们有如下的两个定义:

\\(x\\)轨道:定义为 \\(x\\) 经过 \\(G\\) 中的任意几个变换后能变成的所有新元素,即为集合 \\(\\g(x)|g\\in G\\\\)(因为封闭律,进行一次还是多次变换没有不同)。记作 \\(G(x)\\) .

\\(x\\)稳定子:定义为 \\(G\\) 中所有施加于 \\(x\\) 后仍得到 \\(x\\) 本身的变换构成的集合。即为 \\(\\g|g(x) = x,g\\in G\\\\) 。记作 \\(G^x\\) .

一个性质:\\(x\\) 的稳定子一定是 \\(G\\) 的一个子群。

证明:考虑子群检验定理,设 \\(a,b\\in G^x\\),因为 \\(b(x) = x\\),所以有

\\[a\\circ b^-1(x) = a\\circ b^-1\\circ b(x) = a\\circ e(x) = a(x) \\]

\\(a(x) = x\\),所以 \\(a\\circ b^-1(x) = x\\),即 \\(a\\circ b^-1\\in G^x\\)

证毕。

然后是轨道-稳定子定理,其表述为:

\\[\\forall x\\in X,|G(x)|\\times |G^x| = |G| \\]

证明:考虑刚刚的性质,\\(G^x\\) 一定是一个子群,那么根据拉格朗日定理,我们可以知道

\\[|G^x|\\times [G:G^x] = |G| \\]

所以我们想,如果能在 \\(G^x\\) 的陪集与 \\(G(x)\\) 中的元素之间建立一个双射,就可以证明这个定理了。

考虑到 \\(G(x)\\) 里面的元素都是 \\(g(x)\\) 这样的东西,我们利用其中的 \\(g\\) 建立映射,把 \\(g(x)\\) 映射到 \\(gG^x\\) 这个陪集上。

设有轨道中有两个元素 \\(g(x),f(x)\\),那么有如下推导:

\\[\\beginalign* & gG^x = fG^x \\\\ \\Leftrightarrow & (f^-1\\circ g)G^x = G^x \\\\ \\Leftrightarrow & f^-1 \\circ g = e \\\\ \\Leftrightarrow & f=g \\endalign* \\]

因此我们建立的映射是双射。

证毕。

Part 1 开始计数!


§ 1.0 Burnside计数定理

给定一些立方体,他们的每个面都被染上了某种颜色,计数其中本质不同的立方体数目。

本质不同的立方体是什么?

根据生活常识,两个着色的方案不是本质不同的,当且仅当我们可以通过某种特定的旋转方式,把第一种方案变成第二种。

而一种旋转,可以视作对立方体面的集合进行的一个置换。显然这些置换加上置换复合操作构成一个群 \\(G\\)

然后,我们把一种着色方案视作一个映射,从每一个正方体的面映射到一种特定的颜色,允许有颜色被映射多次,或有颜色不被映射。我们要计数的是在这个置换群 \\(G\\) 的作用下,本质不同的映射数目。

显然,\\(X\\) 中所有能够相互转化的染色方案构成一些连通块,我们把这些连通块记为一些集合 \\(S_1,S_2,\\cdots\\),其中的每一个集合我们称为一个等价类。可以证明所有等价类正好构成了 \\(X\\) 的一个划分。暂且记这个性质为性质 A .

另外,可以发现对于等价类里的某个元素,它的轨道正好就是这个等价类。记此性质为性质 B .

\\(X//G = S_1,S_2,\\cdots\\) . 而我们要计数的是 \\(|X//G|\\) .

Burnside定理给出:

\\[|X//G| = \\frac1 |G| \\sum_g\\in G |X^g| \\]

其中 \\(X^g\\) 表示 \\(g\\) 作用在它上面之后仍得到他自己的 \\(x\\in X\\) 的数目。注意和稳定子不一样!

用方便记忆的语言说:一个映射集合中,本质不同的映射(染色方式)的数目等于所有变换下保持不变的映射数目的平均数

证明如下,其中第三行利用了轨道-稳定子定理,第五行利用了等价类的性质 A 将求和分层,第六行利用了等价类的性质 B:

\\[\\beginalign \\sum_g\\in G X^g &= |\\(g,x)|g(x) = x\\| \\\\ &= \\sum_x\\in X G^x \\\\ &= \\sum_x\\in X \\frac|G||G(x)| \\\\ &= |G|\\sum_x\\in X \\frac1|G(x)| \\\\ &= |G|\\sum_Y\\in (X//G)~\\sum_x\\in Y \\frac1|G(x)| \\\\ &= |G|\\sum_Y\\in (X//G)~\\sum_x\\in Y \\frac1|Y| \\\\ &= |G|\\sum_Y\\in (X//G)1 \\\\ &= |G|\\times|X//G| \\\\ \\endalign \\]

§ 1.1 Pólya定理

假如我们不是给出若干个已经染好色的立方体,而是让你计数在只用特定几种染料的情况下,有多少种给一个立方体染色的本质不同方案,该如何解决呢?

其实相当于把刚刚的 \\(X\\) 集合改为所有由立方体表面的集合 \\(A\\) 向染料集合 \\(B\\) 的映射。

其实这种情况下,\\(X^g\\) 的计算会容易很多。

考虑如果把这个置换 \\(g\\) 拆成不相交的若干个循环置换,那么一个环中的所有元素都必须涂上同一种颜色。

为什么呢?如果有两个相邻的点颜色不同,进行一次置换(沿循环走一步)之后,一定有一个点被映射到的颜色发生改变。

所以,设置换 \\(g\\) 拆成的循环置换个数为 \\(\\textCycle(g)\\),就有 \\(X^g = |B|^\\textCycle(g)\\) .

由此得到了 Pólya 定理,其中 \\(X\\) 为所有 \\(A\\to B\\) 的映射组成的集合。

\\[|X//G| = \\frac1 |G| \\sum_g\\in G \\left||B|^\\textCycle(g)\\right| \\]

Part 2 例题


T0 Pólya定理(模板)

题意:一个 \\(n\\) 元环进行着色,有 \\(n\\) 中颜色可以选,求有多少本质不同的着色方案。(环只能旋转,不能翻转)

解法:首先,所有逆时针旋转都可以转化为顺时针旋转。

然后,考虑如何计数一个“旋转 \\(k\\) 个位置”置换中循环的数量。我们从环上的任意位置开始跳,每次跳 \\(k\\) 步,如果能够跳回到这个点,那么就得到了一个循环。根据这个构造方式,可以得到,所有循环的大小一定是相等的。如果把跳的步数记作 \\(d\\),那么总的循环数为 \\(\\fracnd\\).

接下来,我们知道 \\(d\\) 应满足 \\(kd\\equiv 0\\pmodn\\). 也就是 \\(kd = tn,t\\in Z\\).

推导可得,\\(d = \\fracn\\gcd(n,k)\\),循环的数目为 \\(\\gcd(n,k)\\). 那么我们对循环数目相等,也就是 \\(\\gcd(n,k)\\) 相等的 \\(k\\) 归为一类讨论,发现这种 \\(k\\) 对于一个特定的 \\(\\gcd = D\\) 的数目为 \\(\\varphi(\\fracnD)\\)(因为可以在 \\(k\\) 上乘上一个和 \\(\\fracnD\\) 互质的数,仍然不改变其性质)。

另外观察到,置换群的大小为 \\(n\\).

所以最终的式子就是:

\\[\\textAns = \\frac1 |G| \\sum_d|nn^d\\varphi(\\fracnd) \\]

枚举约数直接计算的复杂度是正确的。

T1 烷基计数

题意:计数含有 \\(n\\) 个碳原子的烷基的个数。(不考虑空间异构)

解法:本质上就是计数【无标号且任意一个节点的度数不超过四】的有根树的数目。考虑使用生成函数,令 \\([x^k]f(x)\\) 表示有 \\(k\\) 个碳原子的烷基的个数。

先考虑孩子有序的情况,这是简单的:

\\[F(x) = 1+x(F\'(x))^3 \\]

然后考虑利用 Burnside 去重,考虑构建一棵有根树,相当于给根的三条朝下的化学键着色,一种颜色就是一种大小的子树,后者的信息保存在上一个迭代的生成函数表达式里。

然后依次考虑对孩子的六种置换,暴力相加。考虑一个置换下某个染色方案不变,只能是每个环都有相同的颜色。

但是不能直接用

  • \\(\\beginpmatrix1&2&3\\\\1&2&3\\endpmatrix\\) 这种情况相当于

T2 烷烃计数

题意:计算含有 \\(n\\) 个碳原子的烷烃的数目。

解法:似乎和刚刚的差不多?只不过从有根树变成了无根树。

让我们仿照上面的方法,计数含有 \\(n\\) 个碳原子,其中恰好有一个为特殊点(树根)的烷烃数目。具体方法差不多,只不过最后要考虑到树根可以有 \\(4\\) 个孩子。

然后呢?如何去重?考虑树的重心(暂且假设只有一个重心),如果

T3 CF1630E Expected Components

题意:从所有本质不同的,长度为 \\(n\\),值域为 \\([1,n]\\) 的环形序列中取出一个,求连续段数目的期望。

做法:可以发现,本质上就是要求连续段数目的平均数。

我们在第二部分要计数的组合对象是什么呢?

既然是圆排列,考虑一个性质:一个圆排列中,【连续段的数目】等于【相邻位置不同颜色】的数目。

那么考虑对于一个要统计连续段数目的排列,对于其中的每一个【相邻位置颜色不相同】的位置二元组,建立一个新的拷贝,在这个拷贝中标记这个位置二元组。然后拷贝的数量就是这个圆排列的连续段个数。

我们现在是从一个圆排列出发,拆出了若干个组合对象,现在转换枚举顺序,扔掉第一步,直接给这个组合对象下个定义:

是一个圆排列,其中有两个相邻的位置是“关键位置”,要求关键位置上的两个值不同。两个组合对象不同当且仅当不能通过旋转圆排列的方法使二者完全重合。

然后把这些组合对象的数目算出来,我们就得到了所有本质不同的圆排列所有连续段的数目之和。

[LOJ 6185]烷基计数

Description

众所周知,大连 24 中是一所神奇的学校,在那里,化竞的同学很多都擅长写代码。

有一天,化学不及格的胡小兔向化竞巨佬晴岚请教化学题:

n 个碳原子的烷基共有多少种同分异构体?”

刚刚得了化竞全市第一的晴岚听了,认为这道题十分简单,建议胡小兔写个程序解决这个问题。但胡小兔弱得连什么是同分异构体都不知道,于是晴岚给胡小兔画了个图——例如 n=4 时(即丁基),有 4 种同分异构体:

技术分享图片

同理,其他常见烷基同分异构体数目如下表:

n 1 2 3 4 5 6
同分异构体数目 1 1 2 4 8 17

现在已知碳原子个数 n,求对应的烷基有多少种同分异构体。

P.S. 2017.11.30更新:化竞巨佬晴岚高二进国集保送北大了……

Input

输入一行,一个整数 n,表示烷基中碳原子的数目。

Output

输出该烷基同分异构体的数目,对 10^9+7 取模。

Sample Input

6

Sample Output

17

Hint

1n400

注意:这里的烷基计数不用考虑空间异构,能否稳定存在等各种特殊情况。也就是说,你要求的是 n 个点的每个点度数不超过 4 且根的度数不超过 3 的有根树的数目。

题解

按照“二叉树个数”的思路,我们可以枚举每个节点儿子子树的大小来做。

值得注意的是,这棵树的儿子是无序的所以不能简单用乘法原理相乘。记 $f_k$ 为子树大小为 $k$ 的生成树的个数。记其三个儿子大小为 $i,j,p$ 显然 $i+j+p = k-1$ 。不妨设 $i <= j <= p$。

满足:

$$f_k =
\begin{cases}
C_{f_i+3-1}^3& \text{i = p}\\
C_{f_i+2-1}^2*f_p& \text{i = j}\\
C_{f_j+2-1}^2*f_i& \text{j = p}\\
f_i*f_j*f_p& \text{otherwise}
\end{cases}$$

其中形同 $C_{n+m-1}^m$ 是可重复的组合数。

 

 1 //It is made by Awson on 2018.1.2
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <queue>
 7 #include <stack>
 8 #include <cstdio>
 9 #include <string>
10 #include <vector>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define LL long long
16 #define Max(a, b) ((a) > (b) ? (a) : (b))
17 #define Min(a, b) ((a) < (b) ? (a) : (b))
18 using namespace std;
19 const int N = 400;
20 const int MOD = 1e9+7;
21 
22 int n;
23 int f[N+5];
24 
25 int quick_pow(int x, int y) {
26     int ans = 1;
27     while (y) {
28     if (y&1) ans = (LL)ans*x%MOD;
29     x = (LL)x*x%MOD, y >>= 1;
30     }
31     return ans;
32 }
33 void work() {
34     scanf("%d", &n);
35     f[0] = 1;
36     for (int k = 1; k <= n; k++)
37     for (int i = 0; i <= k; i++)
38         for (int j = i; j <= k; j++) {
39         int p = k-1-i-j; if (p < j) break;
40         if (i == p) (f[k] += (LL)f[i]*(f[i]+1)%MOD*(f[i]+2)%MOD*quick_pow(6, MOD-2)%MOD) %= MOD;
41         else if (i == j) (f[k] += (LL)f[i]*(f[i]+1)%MOD*quick_pow(2, MOD-2)%MOD*f[p]%MOD) %= MOD;
42         else if (j == p) (f[k] += (LL)f[p]*(f[p]+1)%MOD*quick_pow(2, MOD-2)%MOD*f[i]%MOD) %= MOD;
43         else (f[k] += (LL)f[i]*f[j]%MOD*f[p]%MOD) %= MOD;
44         }
45     printf("%d\n", f[n]);
46 }
47 int main() {
48     work();
49     return 0;
50 }

 

以上是关于数数你的同分异构(完善中)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 2601: [Jsoi2011]同分异构体计数

如何检索findHomography和RANSAC计算出的同分布点?

[LOJ 6185]烷基计数

第六章学习小结

华为云UGO:醒醒!你的异构数据库迁移难题有救了

[化学笔记]:有机化合物(未完待续)