垃圾ACMer的暑假训练220720

垃圾ACMer的暑假训练220720

群论

35.1 Burnside引理与Polya定理

对集合 G G G和作用于 G G G的二元运算 ⋅ \cdot ,若满足如下四个性质,则称 G G G ⋅ \cdot 构成一个,记作 ( G , ⋅ ) (G,\cdot) (G,):

①封闭性:对 ∀ a , b ∈ G \forall a,b\in G a,bG,有 a ⋅ b ∈ G a\cdot b\in G abG.

②结合律:对 ∀ a , b , c ∈ G \forall a,b,c\in G a,b,cG,有 ( a ⋅ b ) ⋅ c = a ⋅ ( b ⋅ c ) (a\cdot b)\cdot c=a\cdot(b\cdot c) (ab)c=a(bc).

③单位元:$\exists e\in G\ s.t.\ 对 对 \forall a\in G , 有 ,有 ,a\cdot e=e\cdot a=a , 则称 ,则称 ,则称e$为单位元.可以证明单位元是唯一的.

④逆元:对 ∀ a ∈ G , ∃ b ∈ G   s . t .   a ⋅ b = b ⋅ a = e \forall a\in G,\exists b\in G\ s.t.\ a\cdot b=b\cdot a=e aG,bG s.t. ab=ba=e,则称 b b b a a a的逆元,记作 a − 1 a^{-1} a1.可以证明逆元是唯一的.

H H H G G G的一个子集.若 ( H , ⋅ ) (H,\cdot) (H,)为群,则称 ( H , ⋅ ) (H,\cdot) (H,) ( G , ⋅ ) (G,\cdot) (G,)子群,记作 H ≤ G H\leq G HG.

∀ g ∈ G , h ∈ H \forall g\in G,h\in H gG,hH:①称 g H = g ⋅ h gH=g\cdot h gH=gh H H H G G G内关于 g g g左陪集;②称 H g = h ⋅ g Hg=h\cdot g Hg=hg H H H G G G内关于 g g g右陪集.

陪集的性质(以右陪集为例):

①对 ∀ g ∈ G \forall g\in G gG,有 ∣ H ∣ = ∣ H g ∣ |H|=|Hg| H=Hg.

​ [] 对$\forall 相异的 相异的 相异的h_1,h_2\in H , 若 ,若 ,h_1\cdot g=h_2\cdot g , 两边右乘 ,两边右乘 ,两边右乘g^{-1} 得 得 h_1=h_2 , 矛盾 . 故 ,矛盾.故 ,矛盾.h_1\cdot g\neq h_2\cdot g$.

②对 ∀ g ∈ G \forall g\in G gG,有 g ∈ H g g\in Hg gHg,进而 H g = H ⇔ g ∈ H Hg=H\Leftrightarrow g\in H Hg=HgH.

​ [] 注意到 e ∈ H e\in H eH,则 e ⋅ g ∈ H g e\cdot g\in Hg egHg.

H a = H b ⇔ a ⋅ b − 1 ∈ H Ha=Hb\Leftrightarrow a\cdot b^{-1}\in H Ha=Hbab1H.

​ [] H a ⋅ b − 1 = H Ha\cdot b^{-1}=H Hab1=H,由②: a ⋅ b − 1 ∈ H a\cdot b^{-1}\in H ab1H.

④若 H a ⋂ H b ≠ ∅ Ha\bigcap Hb\neq \varnothing HaHb=,则 H a = H b Ha=Hb Ha=Hb,这表明:子群 H H H的陪集要么为空集,要么相等.

​ [] 取 c = H a ⋂ H b c=Ha\bigcap Hb c=HaHb,则 ∃ h 1 , h 2 ∈ H   s . t .   h 1 ⋅ a = c = h 2 ⋅ b \exist h_1,h_2\in H\ s.t.\ h_1\cdot a=c=h_2\cdot b h1,h2H s.t. h1a=c=h2b,则 a ⋅ b − 1 = h 2 ⋅ h 1 − 1 ∈ H a\cdot b^{-1}=h_2\cdot h_1^{-1}\in H ab1=h2h11H.由③: H a = H b Ha=Hb Ha=Hb.

H H H的全体右陪集的并为 G G G.

​ [] 对 e ∈ H e\in H eH,取遍 g ∈ G g\in G gG即证.

H ≤ G H\leq G HG,记 G / H G/H G/H G G G中所有 H H H的左陪集,即 G / H = { g H   ∣   g ∈ G } G/H=\{gH\ |\ g\in G\} G/H={gH  gG}.

H ≤ G H\leq G HG,记 [ G : H ] [G:H] [G:H] G G G H H H的不同陪集的数量.

设群 ( G , ⋅ ) (G,\cdot) (G,).对 ∀ x ∈ G \forall x\in G xG,若 ∃ \exists 最小的 d ∈ Z   s . t .   x d = e d\in\mathbb{Z}\ s.t.\ x^d=e dZ s.t. xd=e,则称 d d d为元素 x x x.对有限群, x x x的阶都存在.

有限群 G G G的阶定义为群 G G G的元素个数,无限群的阶规定为 0 0 0.

[Lagrange定理] 设有限群 H H H是有限群 G G G的子群,则 ∣ H ∣ |H| H整除 ∣ G ∣ |G| G,即 H H H的阶整除 G G G的阶,亦即 ∣ H ∣ ⋅ ∣ G : H ∣ = ∣ G ∣ |H|\cdot |G:H|=|G| HG:H=G.

[] 由陪集的性质①④⑤:所有本质不同的陪集互不相交且阶都为 ∣ H ∣ |H| H,并为 G G G,并的阶为 ∣ G ∣ |G| G.

[置换的双行表示法] σ = ( 1 2 3 4 5 2 5 4 3 1 ) \sigma=\begin{pmatrix}1&2&3&4&5 \\ 2&5&4&3&1\end{pmatrix} σ=(1225344351)是上行到下行的一个置换,表示将排列 1   2   3   4   5 1\ 2\ 3\ 4\ 5 1 2 3 4 5映射为 2   5   4   3   1 2\ 5\ 4\ 3 \ 1 2 5 4 3 1.

设集合 N = { 1 , 2 , ⋯   , n } , M N=\{1,2,\cdots,n\},M N={1,2,,n},M N N N的若干个排列构成的集合.令群 G ( M , ⋅ ) G(M,\cdot) G(M,),其中 σ \sigma σ为置换.若 G ( M , ⋅ ) G(M,\cdot) G(M,)满足群的性质,则称 G G G是一个置换群.

对集合 M M M和群 G G G,若给定二元函数 φ ( v , k ) \varphi(v,k) φ(v,k),其中 v v v为群中的元素, k k k为集合中的元素,且 φ ( e , k ) = k , φ ( g , φ ( s , k ) ) = φ ( g ⋅ s , k ) \varphi(e,k)=k,\varphi(g,\varphi(s,k))=\varphi(g\cdot s,k) φ(e,k)=k,φ(g,φ(s,k))=φ(gs,k),则称群 G G G作用于集合 M M M.

对作用于集合 X X X的群 G G G,称 x ∈ X x\in X xX通过 G G G的元素能转移到的元素的集合为 x x x轨道,记作 G ( x ) G(x) G(x).对 g ∈ G g\in G gG,记 g ( x ) g(x) g(x) g g g作用于 x x x的结果,即 g ( x ) = φ ( g , x ) g(x)=\varphi(g,x) g(x)=φ(g,x).

g ∈ G g\in G gG,称群 G G G中满足 g ( x ) = x g(x)=x g(x)=x的元素 g g g构成的集合为 G G G稳定子,即 G x = { g   ∣   g ∈ G , g ( x ) = x } G^x=\{g\ |\ g\in G,g(x)=x\} Gx={g  gG,g(x)=x}.

[定理35.1.1] G x ≤ G G^x\leq G GxG.

[] 显然 e ∈ G x e\in G^x eGx,且 G x G^x Gx满足结合律.

封闭性:设 f , g ∈ G x f,g\in G^x f,gGx,则 f ( x ) = x = g ( x ) f(x)=x=g(x) f(x)=x=g(x),进而 ( f ⋅ g ) ( x ) = x (f\cdot g)(x)=x (fg)(x)=x,即 f ⋅ g ∈ G x f\cdot g\in G^x fgGx.

逆元:设 g ∈ G x g\in G^x gGx,则 g ( x ) = x g(x)=x g(x)=x.因 ( g ⋅ g − 1 ) ( x ) = e ( x ) = x (g\cdot g^{-1})(x)=e(x)=x (gg1)(x)=e(x)=x,则 g − 1 ( x ) = x g^{-1}(x)=x g1(x)=x,即 g − 1 ∈ G x g^{-1}\in G^x g1Gx.

[例35.1.1] 给定一个 2 × 2 2\times 2 2×2的网格,每格可染成黑色或白色,设染色能得到的矩形的集合为 M M M.

给定群 G G G,其成员:①顺时针旋转 9 0 ∘ 90^\circ 90;②顺时针旋转 18 0 ∘ 180^\circ 180;③顺时针旋转 27 0 ∘ 270^\circ 270;④顺时针旋转 0 ∘ 0^\circ 0(模 36 0 ∘ 360^\circ 360).

0 0 0表示白色, 1 1 1表示黑色.对 M M M的一个元素 [ 1 1 0 0 ] \begin{bmatrix}1&1 \\ 0&0\end{bmatrix} [1010],其稳定子 G x G^x Gx { 顺时针旋转 0 ∘ } \{顺时针旋转0^\circ\} {顺时针旋转0},

​ 其轨道为 [ 1 1 0 0 ] , [ 0 1 0 1 ] , [ 0 0 1 1 ] , [ 1 0 1 0 ] \begin{bmatrix}1&1 \\ 0 &0\end{bmatrix},\begin{bmatrix}0&1 \\ 0 &1\end{bmatrix},\begin{bmatrix}0&0 \\ 1 &1\end{bmatrix},\begin{bmatrix}1&0 \\ 1 &0\end{bmatrix} [1010],[0011],[0101],[1100].

[轨道-稳定子定理] ∣ G x ∣ ⋅ ∣ G ( x ) ∣ = ∣ G ∣ |G^x|\cdot |G(x)|=|G| GxG(x)=G,即稳定子大小与轨道大小之积为群的大小.

[] 因 G x ≤ G G^x\leq G GxG,由Lagrange定理: ∣ G x ∣ ⋅ ∣ G : G x ∣ = ∣ G ∣ |G^x|\cdot |G:G^x|=|G| GxG:Gx=G.

只需证 ∣ G : G x ∣ = ∣ G ( x ) ∣ |G:G^x|=|G(x)| G:Gx=G(x),即证每个 g ( x ) g(x) g(x)都能对应 [ G : G x ] [G:G^x] [G:Gx]中的一个左陪集或右陪集.

构造如下的对应关系:

f ( x ) = g ( x ) f(x)=g(x) f(x)=g(x),则 ( f ⋅ g − 1 ) ( x ) = x = e ( x ) ∈ G x (f\cdot g^{-1})(x)=x=e(x)\in G^x (fg1)(x)=x=e(x)Gx.

​ 由陪集的性质: f G x = g G x fG^x=gG^x fGx=gGx,这表明:相同的 f ( x ) f(x) f(x)都能对应相同的陪集,反之亦然.

对每个 g ( x ) g(x) g(x),取 g G x gG^x gGx为其对应的陪集,则相同的 g ( x ) g(x) g(x)都能对应相同的陪集,故证.

设置换群 G G G作用于集合 X X X.若 ∃ x , y ∈ X \exists x,y\in X x,yX G G G的作用下相等,即 ∃ f ∈ G   s . t .   f ( x ) = y \exists f\in G\ s.t.\ f(x)=y fG s.t. f(x)=y,则称 x , y x,y x,y属于同一等价类.

X g X^g Xg X X X g ∈ G g\in G gG的作用下的不动点的的集合,即 X g = { x ∣ x ∈ X , g ( x ) = x } X^g=\{x|x\in X,g(x)=x\} Xg={xxX,g(x)=x}.

[Burnside引理] 设 A A A B B B为有限集, X X X为一些从 A A A B B B的映射组成的集合, G G G A A A上的置换群,且 X X X中的映射在 G G G中的置换作用下封闭.设 X / G X/G X/G表示 G G G作用在 X X X上产生的所有等价类的集合,则 ∣ X / G ∣ = 1 ∣ G ∣ ∑ g ∈ G ∣ X g ∣ \displaystyle |X/G|=\dfrac{1}{|G|}\sum_{g\in G}|X^g| X/G=G1gGXg,且 X g = { x ∣ x ∈ X , g ( x ) = x } X^g=\{x|x\in X,g(x)=x\} Xg={xxX,g(x)=x}.

[] 因每个元素只属于一个轨道,轨道内部在群 G G G的作用下互达,则 ∣ X / G ∣ = ∑ x ∈ X 1 ∣ G : G x ∣ \displaystyle |X/G|=\sum_{x\in X}\dfrac{1}{|G:G^x|} X/G=xXG:Gx1.

由轨道-稳定子定理: ∣ G : G x ∣ = G ∣ G x ∣ |G:G^x|=\dfrac{G}{|G^x|} G:Gx=GxG,则 ∣ X / G ∣ = ∑ x ∈ X 1 ∣ G : G x ∣ = 1 ∣ G ∣ ∑ x ∈ X G x = 1 ∣ G ∣ ∑ g ∈ G ∣ X g ∣ \displaystyle |X/G|=\sum_{x\in X}\dfrac{1}{|G:G^x|}=\dfrac{1}{|G|}\sum_{x\in X}G^x=\dfrac{1}{|G|}\sum_{g\in G}|X^g| X/G=xXG:Gx1=G1xXGx=G1gGXg.

[Polya定理] 在与Burnside引理相同的前提下,若 X X X为所有从 A A A B B B的映射,则 ∣ X / G ∣ = 1 ∣ G ∣ ∑ g ∈ G ∣ B ∣ c ( g ) \displaystyle|X/G|=\dfrac{1}{|G|}\sum_{g\in G}|B|^{c(g)} X/G=G1gGBc(g),其中 c ( g ) c(g) c(g)表示置换 g g g能拆分成的不相交的循环置换的数量.

[] Burnside引理中 g ( x ) = x g(x)=x g(x)=x的充要条件是: x x x g g g中的每个循环置换的元素都映射到 B B B中的同一元素.

∣ X ∣ g = ∣ B ∣ c ( g ) |X|^g=|B|^{c(g)} Xg=Bc(g),即Poyla定理.

[例35.1.2] 用 3 3 3种颜色给一个正方体染色,求本质不同的方案数(经翻转后相同的两种方案视为同种).

[解1] 设 A A A为正方体 6 6 6个面的集合, B B B 3 3 3种颜色的集合, X X X为直接给每个面染色,不考虑本质不同的方案的集合(共 3 6 3^6 36种方案), G G G为各种翻转操作构成的置换群, X / G X/G X/G为本质不同的染色方案的集合, X g X^g Xg为某一翻转操作 g g g的所有直接染色方案中,经翻转 g g g后保持不变的染色方案的集合.

称正方体的 6 6 6个面分别为前、后、上、下、左、右.

G G G的所有置换可分为如下几类:

①不动:即恒等变换,所有直接染色方案经恒等变换都不变,对应的 ∣ X g ∣ = 3 6 |X^g|=3^6 Xg=36.

②以两相对面的中心连线为轴的 9 0 ∘ 90^\circ 90旋转:相对面有 3 3 3种选择,旋转方向有 2 2 2种选择,则该类有 6 6 6个置换.

​ 设选择前、后两面的中心连线为轴,则需上、下、左、右四个面颜色相同才能使旋转后不变,对应的 ∣ X g ∣ = 3 3 |X^g|=3^3 Xg=33.

③以两相对面的中心连线为轴的 18 0 ∘ 180^\circ 180旋转:相对面有 3 3 3种选择,旋转方向的选择对置换无影响,则该类有 3 3 3个置换.

​ 设选择前、后两面的中心连线为轴,则需上、下两面和左、右两面颜色相同才能使旋转后不变,对应的 ∣ X g ∣ = 3 4 |X^g|=3^4 Xg=34.

④以两条相对棱的终点连线为轴的 18 0 ∘ 180^\circ 180旋转:相对棱有 6 6 6种选择,旋转方向对置换无影响,则该类有 6 6 6个置换.

​ 设选择前、上量面的边界和下、后两面的边界为相对棱,则需前、上两面和下、后两面和左、右两面颜色相同

​ 才能使旋转后不变,对应的 ∣ X g ∣ = 3 3 |X^g|=3^3 Xg=33.

⑤以两相对顶点连线为轴的 12 0 ∘ 120^\circ 120旋转.相对顶点有 4 4 4种选择,旋转方向有 2 2 2种选择,则该类有 8 8 8个置换.

​ 设选择前面的右上角和后面的左下角为相对顶点,则需前、上、有三个面和后、下、左三个面颜色相同

​ 才能使旋转后不变,对应的 ∣ X g ∣ = 3 2 |X^g|=3^2 Xg=32.

综上,本质不同的方案数 1 1 + 6 + 3 + 6 + 8 ( 3 6 + 6 × 3 3 + 3 × 3 4 + 6 × 3 3 + 8 × 3 2 ) = 57 \dfrac{1}{1+6+3+6+8}(3^6+6\times 3^3+3\times 3^4+6\times 3^3+8\times 3^2)=57 1+6+3+6+81(36+6×33+3×34+6×33+8×32)=57.

[解2] 分析解I中的④:设前、后、上、下、左、右 6 6 6个面依次编号为 1 ∼ 6 1\sim 6 16,则置换可表示为 ( 1 , 3 , 2 , 4 , 5 , 6 3 , 1 , 4 , 2 , 6 , 5 ) = ( 1 , 3 ) ∘ ( 2 , 4 ) ∘ ( 5 , 6 ) \begin{pmatrix}1,3,2,4,5,6 \\ 3,1,4,2,6,5\end{pmatrix}=(1,3)\circ (2,4)\circ(5,6) (1,3,2,4,5,63,1,4,2,6,5)=(1,3)(2,4)(5,6),其中翻转后 1 1 1面换到了 3 3 3面, 3 3 3面换到了 1 1 1面,以此类推.

c ( g ) = 3 , ∣ B ∣ c ( g ) = 3 3 c(g)=3,|B|^{c(g)}=3^3 c(g)=3,Bc(g)=33.

实际应用中,若循环置换间相互独立,则可用Polya定理;否则只能用Burnside引理.


35.1.1 Pólya 定理

题意

t    ( 1 ≤ t ≤ 1000 ) t\ \ (1\leq t\leq 1000) t  (1t1000)组测试数据.每组测试数据输入一个整数 n    ( 1 ≤ n ≤ 1 e 9 ) n\ \ (1\leq n\leq 1\mathrm{e}9) n  (1n1e9),表示给定一个 n n n个点、 n n n条边的环.现用 n n n种颜色给每个点染色,求本质不同的染色方案数,答案对 1 e 9 + 7 1\mathrm{e}9+7 1e9+7取模.本质不同的染色方案定义为:不能通过旋转与别的染色方案相同.

思路

本质不同的 n n n个点的环可视为在置换群 G = { 旋转 0 个 , 旋转 1 个 , ⋯   , 旋转 ( n − 1 ) 个 } G=\{旋转0个,旋转1个,\cdots,旋转(n-1)个\} G={旋转0,旋转1,,旋转(n1)}作用下得到的等价类的数量.

定义集合 M M M 1 ∼ n 1\sim n 1n的全排列表示的环构成的集合.由Burnside引理: a n s = 1 ∣ G ∣ ∑ g ∈ G ∣ M g ∣ \displaystyle ans=\dfrac{1}{|G|}\sum_{g\in G}|M^g| ans=G1gGMg.

考虑每个置换对答案的贡献:

①旋转 0 0 0个的置换的不动点数为 n n n^n nn,即所有集合都合法.

②旋转 k k k个的置换,注意到一个元素是不动点等价于其存在一个长度为 a a a的循环节满足 a ∣ k a\mid k ak,而 a ∣ n a\mid n an,则可改写判定条件为存在一个长度为 gcd ⁡ ( k , n ) \gcd(k,n) gcd(k,n)的循环节.因该种置换中每个子串的前 gcd ⁡ ( k , n ) \gcd(k,n) gcd(k,n)任取,则不动点数为 n gcd ⁡ ( k , n ) n^{\gcd(k,n)} ngcd(k,n).

a n s = 1 n ∑ k = 1 n n gcd ⁡ ( k , n ) = d = gcd ⁡ ( k , n ) 1 n ∑ d ∣ n x d ⋅ ∑ k = 1 n d [ gcd ⁡ ( k , n d ) = 1 ] = 1 n ∑ d ∣ n n d φ ( n d ) \displaystyle ans=\dfrac{1}{n}\sum_{k=1}^n n^{\gcd(k,n)}\xlongequal{d=\gcd(k,n)}\dfrac{1}{n}\sum_{d\mid n}x^d\cdot \sum_{k=1}^\frac{n}{d}\left[\gcd\left(k,\dfrac{n}{d}\right)=1\right]=\dfrac{1}{n}\sum_{d\mid n}n^d\varphi\left(\dfrac{n}{d}\right) ans=n1k=1nngcd(k,n)d=gcd(k,n) n1dnxdk=1dn[gcd(k,dn)=1]=n1dnndφ(dn)

= q = n d 1 n ∑ p ∣ n φ ( p ) ⋅ n n p = ∑ p ∣ n φ ( p ) ⋅ n n p − 1 \displaystyle\xlongequal{q=\frac{n}{d}}\dfrac{1}{n}\sum_{p\mid n}\varphi(p)\cdot n^\frac{n}{p}=\sum_{p\mid n}\varphi(p)\cdot n^{\frac{n}{p}-1} q=dn n1pnφ(p)npn=pnφ(p)npn1.

代码
const int MOD = 1e9 + 7;

int phi(int x) {
	int res = x;
	for (int i = 2; i <= x / i; i++) {
		if (x % i == 0) {
			res = res / i * (i - 1);
			while (x % i == 0) x /= i;
		}
	}
	if (x > 1) res = res / x * (x - 1);
	return res;
}

int main() {
	CaseT{
		int n; cin >> n;

		int ans = 0;
		for (int d = 1; d <= n / d; d++) {  // 枚举n的约数
			if (n % d)continue;

			ans = ((ll)ans + (ll)phi(d) * qpow(n, n / d - 1, MOD)) % MOD;
			if (d * d != n) ans = ((ll)ans + (ll)phi(n / d) * qpow(n, d - 1, MOD)) % MOD;
		}
		cout << ans << endl;
	}
}


35.1.2 串珠子

题意

给定 m m m种不同颜色的珠子,每种颜色的珠子个数足够多.现需从中选出 n n n个珠子,串成一个环形手链,问能制成多少种本质不同的手链.本质不同定义为:不能通过旋转或翻转与其他方案对应位置上的珠子颜色相同.

有多组测试数据.每组测试数据输入两整数 m , n    ( n , m > 0 , n m ≤ 32 ) m,n\ \ (n,m>0,nm\leq 32) m,n  (n,m>0,nm32),最后一行输入 0   0 0\ 0 0 0表示输入结束.

对每组测试数据,输出能制成多少种本质不同的手链.

思路

考虑有多少种不同的置换及其循环数:

(1)旋转:转 k    ( k = 0 , 1 , ⋯   , n − 1 ) k\ \ (k=0,1,\cdots,n-1) k  (k=0,1,,n1)次,共 n n n种置换.

​ 环上序号 x x x的珠子转 k k k次得到的序号为 ( x + k ) (x+k) (x+k).为出现循环,应使 x + k t ≡ x    ( m o d   n ) x+kt\equiv x\ \ (\mathrm{mod}\ n) x+ktx  (mod n),则 k t ≡ 0    ( m o d   n ) kt\equiv0\ \ (\mathrm{mod}\ n) kt0  (mod n).

t t t是不定方程 k t + n r = 0 kt+nr=0 kt+nr=0的最小正整数解.设 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k),则 t = n d t=\dfrac{n}{d} t=dn,即转 n d \dfrac{n}{d} dn步出现循环,亦即每个循环上有 n d \dfrac{n}{d} dn个点.

​ 因每个循环独立,则 n n n个点有 n n d = d \dfrac{n}{\dfrac{n}{d}}=d dnn=d个循环.有 m m m种颜色,则不动点数为 m d m^d md.

​ 故旋转置换对答案的贡献为 ∑ k = 0 m m gcd ⁡ ( n , k ) \displaystyle \sum_{k=0}^m m^{\gcd(n,k)} k=0mmgcd(n,k).

(2)翻转:

​ ①奇数个珠子:对每个珠子,自己映射到自己,其余珠子左右对称配对,有 m n + 1 2 m^{\frac{n+1}{2}} m2n+1个循环,则 n n n个珠子共 n ⋅ m n + 1 2 n\cdot m^\frac{n+1}{2} nm2n+1个循环.

​ ②偶数个珠子:

​ i)若对称轴穿过相对的两珠子,则有 m n 2 + 1 m^{\frac{n}{2}+1} m2n+1个循环, n 2 \dfrac{n}{2} 2n条对称轴共 n 2 ⋅ m n 2 + 1 \dfrac{n}{2}\cdot m^{\frac{n}{2}+1} 2nm2n+1个循环.

​ ii)若对称轴在相对的四珠子间,则有 m n 2 m^\frac{n}{2} m2n个循环, n 2 \dfrac{n}{2} 2n条对称轴共 n 2 ⋅ m n 2 \dfrac{n}{2}\cdot m^{\frac{n}{2}} 2nm2n个循环.

代码
ll power(int a, int b) {  // a的b次方
	ll res = 1;
	while (b--) res *= a;
	return res;
}

int main() {
	int m, n;
	while (cin >> m >> n, m || n) {
		ll ans = 0;
		for (int i = 0; i < n; i++) ans += power(m, gcd(n, i));  // 旋转置换

		// 翻转置换
		if (n & 1) ans += n * power(m, (n + 1) / 2);
		else ans += n / 2 * (power(m, n / 2 + 1) + power(m, n / 2));
		ans /= 2 * n;
		cout << ans << endl;
	}
}


35.1.3 魔法手链

题意 ( 3   s 3\ \mathrm{s} 3 s)

给定编号 1 ∼ m 1\sim m 1m m m m种不同颜色的珠子,每种颜色的珠子个数足够多.现需从中选出 n n n个珠子,串成一个环形手链.珠子间存在 k k k对排斥关系,互相排斥的两种颜色的珠子不能相邻(同种颜色的珠子也可能排斥).问能制成多少种本质不同的手链,答案对 9973 9973 9973取模.本质不同定义为:不能通过旋转(不考虑翻转)与其他方案对应位置上的珠子颜色相同.

t    ( 1 ≤ t ≤ 10 ) t\ \ (1\leq t\leq 10) t  (1t10)组测试数据.每组测试数据第一行输入整数 n , m , k    ( 1 ≤ n ≤ 1 e 9 , gcd ⁡ ( n , 9973 ) = 1 , 1 ≤ m ≤ 10 , 0 ≤ k ≤ m ( m + 1 ) 2 ) n,m,k\ \ \left(1\leq n\leq 1\mathrm{e}9,\gcd(n,9973)=1,1\leq m\leq 10,0\leq k\leq\dfrac{m(m+1)}{2}\right) n,m,k  (1n1e9,gcd(n,9973)=1,1m10,0k2m(m+1)).接下来 k k k行每行输入两个整数 a , b    ( 1 ≤ a , b ≤ m ) a,b\ \ (1\leq a,b\leq m) a,b  (1a,bm),表示颜色 a a a的珠子与颜色 b b b的珠子不能相邻.

对每组测试数据,输出能制成多少种本质不同的手链,答案对 9973 9973 9973取模.

思路

旋转置换:转 k    ( k = 0 , 1 , ⋯   , n − 1 ) k\ \ (k=0,1,\cdots,n-1) k  (k=0,1,,n1)次,共 n n n种置换.

环上序号 x x x的珠子转 k k k步得到的序号为 ( x + k ) (x+k) (x+k).为出现循环,应使 x + k t ≡ x    ( m o d   n ) x+kt\equiv x\ \ (\mathrm{mod}\ n) x+ktx  (mod n),则 k t ≡ 0    ( m o d   n ) kt\equiv0\ \ (\mathrm{mod}\ n) kt0  (mod n).

t t t是不定方程 k t + n r = 0 kt+nr=0 kt+nr=0的最小正整数解.设 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k),则 t = n d t=\dfrac{n}{d} t=dn,即转 n d \dfrac{n}{d} dn步出现循环,亦即每个循环上有 n d \dfrac{n}{d} dn个点.

因每个循环独立,则 n n n个点有 n n d = d \dfrac{n}{\dfrac{n}{d}}=d dnn=d个循环.

每个循环的 n d \dfrac{n}{d} dn个点按编号顺序放在圆上,则它们两两间隔为 d d d.

[] 环上序号 x x x的珠子能转到的序号为 ( x + k ) , ( x + 2 k ) , ( x + 3 k ) ⋯ (x+k),(x+2k),(x+3k)\cdots (x+k),(x+2k),(x+3k).

d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k),则它们两两间的距离是 d d d的倍数,它们与 x x x号珠子相距 0 , d , 2 d , 3 d ⋯ 0,d,2d,3d\cdots 0,d,2d,3d.

n ′ = n d , k ′ = k d n'=\dfrac{n}{d},k'=\dfrac{k}{d} n=dn,k=dk,考虑在 n ′ n' n个点的环上转 k ′ k' k次,则能转到的珠子与 x x x号珠子相距 0 , 1 , 2 , 3 ⋯ 0,1,2,3\cdots 0,1,2,3,

​ 这表明:每次转 k ′ k' k补能遍历圆上的所有点,即 0 k ′ , 1 k ′ , 2 k ′ , ⋯   , ( n − 1 ) k ′ 0k',1k',2k',\cdots,(n-1)k' 0k,1k,2k,,(n1)k 0 ∼ n 0\sim n 0n的一个简化剩余系.

第一个循环的起点为 x x x,第二个循环的起点为 x + 1 x+1 x+1, ⋯ \cdots ,第 d d d个循环的起点为 x + d − 1 x+d-1 x+d1.

若是不动点,则 x x x x + d , x + 2 d , ⋯ x+d,x+2d,\cdots x+d,x+2d,的颜色相同, x + 1 x+1 x+1 x + 1 + d , x + 1 + 2 d , ⋯ x+1+d,x+1+2d,\cdots x+1+d,x+1+2d,的颜色相同, ⋯ \cdots ,

​ 这表明: [ x , x + d − 1 ] [x,x+d-1] [x,x+d1]的颜色在环上循环,即环可分为 d d d段,每一段上的珠子颜色对应相同.

显然只需考虑 [ x , x + d − 1 ] [x,x+d-1] [x,x+d1]这一段的颜色,且与 x + d − 1 x+d-1 x+d1相邻的点即 x x x,则可将 [ x , x + d − 1 ] [x,x+d-1] [x,x+d1]视为一个小环,只需求该小环的染色方案数.

设小环上珠子的编号为 1 ∼ d 1\sim d 1d,可将 d d d视为 0 0 0号.枚举 d d d染的颜色, d p [ i ] [ j ] dp[i][j] dp[i][j]表示已染完前 i i i个珠子,且第 ( i + 1 ) (i+1) (i+1)个珠子染 j j j色的方案数.若 d d d 1 1 1色,则初始化 d p [ 0 ] [ 1 ] = 1 , d p [ 0 ] [ j ] = 0    ( j ≠ 1 ) dp[0][1]=1,dp[0][j]=0\ \ (j\neq 1) dp[0][1]=1,dp[0][j]=0  (j=1);若 d d d 2 2 2色,则初始化 d p [ 0 ] [ 2 ] = 1 , d p [ 0 ] [ j ] = 0    ( j ≠ 2 ) , ⋯ dp[0][2]=1,dp[0][j]=0\ \ (j\neq 2),\cdots dp[0][2]=1,dp[0][j]=0  (j=2),.转移时若当前珠子染 j j j,上一个珠子染 k k k,则 d p [ i ] [ j ] + = d p [ i − 1 ] [ k ] dp[i][j]+=dp[i-1][k] dp[i][j]+=dp[i1][k].最终对 d p [ d ] [ 1 ] dp[d][1] dp[d][1]统计答案.

n n n最大 1 e 9 1\mathrm{e}9 1e9,直接暴力转移会超时.考虑矩阵乘法优化.令 F ( i ) = [ f ( i , 1 )   f ( i , 2 )   ⋯   f ( i , m ) ] F(i)=[f(i,1)\ f(i,2)\ \cdots\ f(i,m)] F(i)=[f(i,1) f(i,2)  f(i,m)],则 F ( i ) = F ( i − 1 ) ⋅ M F(i)=F(i-1)\cdot M F(i)=F(i1)M,其中转移矩阵 M M M中若 k k k j j j相邻则为 1 1 1,否则为 0 0 0.最终 F ( d ) = F ( 0 ) ⋅ M d F(d)=F(0)\cdot M^d F(d)=F(0)Md,用快速幂优化,时间复杂度 O ( m 3 log ⁡ n ) O(m^3\log n) O(m3logn). m m m种颜色可同时转移,即 M M M左乘一个 m × m m\times m m×m的单位矩阵,最后对矩阵的对角线求和即可.

k k k不能直接枚举 0 ∼ ( n − 1 ) 0\sim (n-1) 0(n1),注意到方案数只取决于 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k),则可将 k k k d d d分类,只需枚举 n n n的不超过 1600 1600 1600个约数即可.此时每个 gcd ⁡ ( n , k ) = d \gcd(n,k)=d gcd(n,k)=d k k k的方案数都可用 F ( d ) = F ( 0 ) ⋅ M d F(d)=F(0)\cdot M^d F(d)=F(0)Md求出.考察有多少个 k   s . t .   gcd ⁡ ( n , k ) = d k\ s.t.\ \gcd(n,k)=d k s.t. gcd(n,k)=d,即有多少个 k d   s . t .   gcd ⁡ ( n d , k d ) = 1 \dfrac{k}{d}\ s.t.\ \gcd\left(\dfrac{n}{d},\dfrac{k}{d}\right)=1 dk s.t. gcd(dn,dk)=1,显然有 φ ( n d ) \varphi\left(\dfrac{n}{d}\right) φ(dn)个,暴力求时间复杂度 O ( n d ) O\left(\sqrt{\dfrac{n}{d}}\right) O(dn ).

9973 9973 9973是素数,可直接快速幂求 n n n的逆元.

代码
const int MAXN = 11;  // 最大颜色数
const int MOD = 9973;
int n, m, k;  // 珠数、颜色数、限制数
struct Matrix {
	int arr[MAXN][MAXN];

	Matrix() { memset(arr, 0, so(arr)); }

	friend Matrix operator*(const Matrix& A, const Matrix& B) {
		Matrix res;
		for (int i = 1; i <= m; i++)
			for (int j = 1; j <= m; j++)
				for (int k = 1; k <= m; k++)
					res.arr[i][j] = (res.arr[i][j] + A.arr[i][k] * B.arr[k][j]) % MOD;
		return res;
	}
};

int qpow(Matrix A, int b) {
	Matrix C;
	for (int i = 1; i <= m; i++) C.arr[i][i] = 1;  // 初始化为单位矩阵

	while (b) {
		if (b & 1) C = C * A;
		A = A * A;
		b >>= 1;
	}

	int res = 0;
	for (int i = 1; i <= m; i++) res = (res + C.arr[i][i]) % MOD;  // 对矩阵的对角线统计答案
	return res % MOD;
}

int phi(int x) {
	int res = x;
	for (int i = 2; i <= x / i; i++) {
		if (x % i == 0) {
			res = res / i * (i - 1);
			while (x % i == 0) x /= i;
		}
	}
	if (x > 1) res = res / x * (x - 1);
	return res % MOD;
}

int main() {
	CaseT{
		cin >> n >> m >> k;
		
		Matrix tr;  // 转移矩阵
		for (int i = 1; i <= m; i++)
			for (int j = 1; j <= m; j++) tr.arr[i][j] = 1;  // 初始时都能转移

		while (k--) {
			int a, b; cin >> a >> b;
			tr.arr[a][b] = tr.arr[b][a] = 0;  // 有限制的不能转移
		}
				 
		int ans = 0;
		for (int d = 1; d <= n / d; d++) {  // 枚举n的约数
			if (n % d == 0) {
				ans = (ans + qpow(tr, d) * phi(n / d)) % MOD;
				if (d != n / d) ans = (ans + qpow(tr, n / d) * phi(d)) % MOD;
			}
		}
		cout << (ll)ans * qpow(n, MOD - 2, MOD) % MOD << endl;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值