Burnside引理與Polya定理

2022-09-18 20:36:11 字數 3964 閱讀 8460

一類狀態在乙個置換群 (\(g\)) 的作用下本質不同的狀態(不同等價類)個數

\(∣x/g∣=\dfrac*\sum\limits_c(r)\)

\(c(r)\)表示在 \(r\) 這一置換作用下不動點(狀態不變的方案)的個數。

證明略。

\(c(r)=k^m\)

\(k\) 為當前置換不同迴圈的個數,\(m\)為可賦予顏色數。

即位於同一迴圈(可互相替代,專業叫等價類)的元素顏色相同才能成為不動點。

不同的翻轉操作即為置換群。

對於向下 $90^\circ $ 的操作,中間四個面,左邊的面,右邊的麵即為三個不同的迴圈(等價類)。

給定乙個 \(n\) 個點,\(n\) 條邊的環,有 \(n\) 種顏色,給每個頂點染色,問有多少種本質不同的染色方案。

咳咳,不是我懶得寫,主要 latex 太難打了。

說明一下那個 \(gcd\) 那點:

對於乙個旋轉 \(k\) 次的操作,當前點旋轉 \(n/gcd(n,k)\) 次就會回到當前點,即 \(k * ( n / gcd ( n,k ) ) %n == 0\) 。因此乙個迴圈有 \(n/gcd(n,k)\) 節點,所以一共有 \(gcd(n,k)\) 個迴圈。

#includeusing namespace std;

#define ll long long

const ll n=1e5+8;

ll n;

const ll mod=1e9+7;

ll qm(ll x,int p)

ll read()

return x;

}ll ol(ll x)

if(x>1) ans=ans*(x-1)%mod*qm(x,mod-2)%mod;

return ans%mod;

}int main()

printf("%lld\n",ans);

}}

還有道一樣的題:【例題1】彩色項鍊1

【例題2】彩色項鍊2

改成 \(m\) 種顏色還是一樣的,只是改一下對應底數就行,翻轉的操作也較好處理。

還有一道:p5233 [jsoi2012]愛之項鍊

本題還不清楚為啥 t 了。亂開longlong害死人。

關於波利亞定理的運用是一樣的,只是多了個 \(dp\) 和數學求斐波那契數列一類的通項公式的方法,後者還沒學會,不過可以用矩陣代替。

邊有兩種顏色,

求含 n 個點的圖在同構意義下不同構的圖的數目。

a圖與b圖被認為是同構的是指:a圖的頂點經過一定的重新標號以後,a圖的頂點集和邊集要完全與b圖一一對應。

對於自己來說可能更清楚的講解:

乙個圖的置換,其實就是找一種排列來替換 \(1\thicksim n\)的點。

對於乙個置換,將其拆為若干個互不影響的置換。

2 3 1

1 2 3

以上置換代表用 2 3 1 頂替 1 2 3。

例如:5 3 2 1 4

1 2 3 4 5

將其拆為

5 1 4

1 4 5

和3 2

2 3下面將邊分為兩類。

一:兩端點在同一置換裡。

對於每個置換而言,將其按順序排好

例如3 4 2 1

1 2 3 4

按 1 4 2 3 的順序排(因為元素是按這個順序流動的)。

排成乙個正多邊形,會發現不同長度(即相隔不同個數的點)的邊屬於不同的等價類,因此有 \(\left\lfloor\dfrac\right\rfloor\) 種不同的等價類,\(p[i]\) 為該置換點數。

二:兩端點在不同置換裡。

一條邊想轉回自己的位置要走 \(lcm(p[i],p[j])\) 下,即兩點同時回到原位,因此這 \(lcm(p[i],p[j])\) 條邊屬於乙個等價類,共有 \(p[i]*p[j]\) 條邊,因此有 \(p[i]*p[j]/lcm(p[i],p[j])=gcd(p[i],p[j]\))。

綜上答案為:

\(b\) 同 \(p\),\(k\)為拆分出來的置換個數。

最後,為了使計算快捷,直接列舉(爆搜)本質不同的置換,即將 \(n\) 拆分。

考慮有多少種拆成 \(p\) 這種方案的。

用 \(\dfrac}\) 算出點的分配方案。

對於乙個置換裡的點,相當於乙個 \(n\) 邊型頂點的排列,即圓排列,因此有對於乙個置換來說有 \((p[i]-1)!\) 種排列方案,總的就要乘上 \(\prod_\)。

最後,對於長度相等的迴圈它們之間可以彼此交換,本質上是一樣的,因此還是會算重。設 \(c\) 表示表某個長度的迴圈的個數,則會算重 \(c!\) 倍。因此答案還需除以 \(\prod_\) 。

算上除以的置換群大小 \(n!\),總答案為:

黑題完成!

#includeusing namespace std;

const int n=65;

const int mod=997;

int n;

int p[n],tot;

int t[n];

int jc[n];

int ans=0;

int minn(int a,int b)

int maxx(int a,int b)

int gcd(int a,int b)

void work()

ans=(ans+qm(2,k)*tmp%mod)%mod;

}void dfs(int x,int h,int s)

;mt tp;

mt operator * (const mt x,const mt y)

return c;

}int qm(int x,int p)

int gcd(int a,int b)

mt mq(int k)

return p;

}int work(int k)

return num;

}int ol(int x)

if(x>1) p=p*(x-1)%mod*qm(x,mod-2)%mod;

return p;

}signed main()

ans=0;

for(int i=1;i*i<=n;i++)

ans=ans*qm(n,mod-2)%mod;

printf("%lld\n",ans);

}}

\(n\) 個人圍繞著圓桌坐著,其中一些是男孩,另一些是女孩。你的任務是找出所有合法的方案數,使得不超過 \(k\) 個女孩座位是連續的。迴圈同構會被認為是同一種方案。

先套公式,難點在於如何求乙個置換下不動點的個數。

設 \(f[i][j]\) 表示長度為 \(i\) 第乙個為男生最後有連續 \(j\) 個女生的方案數。

列舉合法長度乘上合法位置數即可。注意特判全為女生的情況。

#includeusing namespace std;

#define ll unsigned long long

const int mod=1e8+7;

const int n=2005;

int n,k;

ll f[n][n];

ll qm(ll x,int p)

int gcd(int a,int b)

ll work(int p)

int main()

{ int t;

cin>>t;

while(t--)

{ memset(f,0,sizeof(f));

scanf("%d%d",&n,&k);

if(k>n) k=n;

f[1][0]=1;

for(int i=2;i<=n;i++)

{ for(int j=0;j垃圾題目把模數寫錯了浪費我半天時間!!!

Burnside引理與Polya定理

感覺這兩個東西好鬼畜 考場上出了肯定不會qwq。不過還是學一下吧用來裝逼也是極好的 與下文知識無關。給出乙個集合 g 和集合上的二元運算 並滿足 1 封閉性 forall a,b in g,exists c in g,a b c 2 結合律 forall a,b,c in g,a b c a b c...

Burnside引理與Polya定理

感覺這兩個東西好鬼畜 考場上出了肯定不會qwq。不過還是學一下吧用來裝逼也是極好的 與下文知識無關。給出乙個集合 g 和集合上的二元運算 並滿足 1 封閉性 forall a,b in g,exists c in g,a b c 2 結合律 forall a,b,c in g,a b c a b c...

Burnside 引理與 P lya 定理

在數學中,群是由一種集合以及乙個二元運算所組成的,符合 群公理 的代數結構。乙個群是乙個集合 g 加上對 g 的二元運算。二元運算用 cdot 表示,它結合了任意兩個元素 a 和 b 形成了乙個屬於 g 的元素,記為 a cdot b 群公理包含下述四個性質 有時略去封閉性,只有三個性質 若集合 和...