一類狀態在乙個置換群 (\(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 群公理包含下述四個性質 有時略去封閉性,只有三個性質 若集合 和...