P4980-[模板]Pólya定理
正題
題目鏈接:https://www.luogu.com.cn/problem/P4980
題目大意
nnn個(gè)物品圖上mmm種顏色,求在可以旋轉(zhuǎn)的情況下本質(zhì)不同的涂色方案。
解題思路
既然是群論基本題就順便寫一下剛剛了解到的相關(guān)知識(shí)把(順便消磨一下時(shí)間
一個(gè)群(G,×)(G,\times )(G,×)定義為一個(gè)在運(yùn)算×\times×下滿足以下條件的集合
然后中間一些東西很多很雜這里不多說(shuō)了,直接到置換部分。
一般來(lái)說(shuō)規(guī)定置換第一行為(1,2,3...)(1,2,3...)(1,2,3...),那么定義一個(gè)置換σ=(g1,g2,g3,...)\sigma=(g_1,g_2,g_3,...)σ=(g1?,g2?,g3?,...)。如果一個(gè)置換作用與一個(gè)排列aaa,一般寫為σ(a)=b\sigma(a)=bσ(a)=b的話,就有bi=agib_i=a_{g_i}bi?=agi??。需要注意的是對(duì)于一個(gè)置換兩次后相當(dāng)與使用了另一個(gè)置換。(也就是置換只能生效一次
然后就是Burnside\text{Burnside}Burnside引理了,對(duì)于一個(gè)置換群GGG,若GGG作用與一個(gè)集合XXX時(shí),集合XXX中本質(zhì)不同的元素個(gè)數(shù)為
1∣G∣∑f∈GC(f)\frac{1}{|G|}\sum_{f\in G}C(f)∣G∣1?f∈G∑?C(f)
其中C(f)C(f)C(f)表示XXX的所有元素中對(duì)于置換fff的不動(dòng)點(diǎn)數(shù)量。
而Polya\text{Polya}Polya定理就是建立在Burnside\text{Burnside}Burnside引理上的,對(duì)于一個(gè)置換fff,定義它的循環(huán)節(jié)數(shù)量為T(f)T(f)T(f),用mmm種顏色染色時(shí)方本質(zhì)不同的染色方案數(shù)就是
1∣G∣∑f∈GmT(f)\frac{1}{|G|}\sum_{f\in G}m^{T(f)}∣G∣1?f∈G∑?mT(f)
也就是mT(f)=C(f)m^{T(f)}=C(f)mT(f)=C(f),這個(gè)很顯然,因?yàn)槊總€(gè)循環(huán)節(jié)涂成一種顏色就是一個(gè)不動(dòng)點(diǎn)。
回到這題的旋轉(zhuǎn)來(lái),我們可以將其視為nnn個(gè)不同的置換構(gòu)成的一個(gè)置換群。對(duì)于旋轉(zhuǎn)iii步,它的循環(huán)節(jié)數(shù)量就是gcd(n,i)gcd(n,i)gcd(n,i),也就是我們要求
1n∑i=0n?1mgcd(n,i)\frac{1}{n}\sum_{i=0}^{n-1}m^{gcd(n,i)}n1?i=0∑n?1?mgcd(n,i)
枚舉一下gcd(n,i)gcd(n,i)gcd(n,i)
1n∑d∣nmd∑i=1nd[gcd(nd,i)==1]\frac{1}{n}\sum_{d|n}m^d\sum_{i=1}^{\frac{n}ozvdkddzhkzd}[gcd(\frac{n}ozvdkddzhkzd,i)==1]n1?d∣n∑?mdi=1∑dn??[gcd(dn?,i)==1]
哦對(duì)啊好像有m=nm=nm=n
1n∑d∣nndφ(nd)=∑d∣nnd?1φ(nd)\frac{1}{n}\sum_{d|n}n^d\varphi(\frac{n}ozvdkddzhkzd)=\sum_{d|n}n^{d-1}\varphi(\frac{n}ozvdkddzhkzd)n1?d∣n∑?ndφ(dn?)=d∣n∑?nd?1φ(dn?)
這個(gè)時(shí)間復(fù)雜度大概是O(Tn34)O(Tn^{\frac{3}{4}})O(Tn43?)的,但是因?yàn)榧s數(shù)個(gè)數(shù)遠(yuǎn)到不了n\sqrt nn?所以你可以把它視為常數(shù)比較大的O(Tn)O(T\sqrt n)O(Tn?)?
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll P=1e9+7; ll T,n,ans; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } ll phi(ll x){ll ans=x;for(ll i=2;i*i<=x;i++){if(x%i)continue;while(x%i==0)x/=i;ans=ans/i*(i-1);}if(x>1)ans=ans/x*(x-1);return ans; } ll calc(ll x) {return phi(x)*power(n,n/x-1)%P;} signed main() {scanf("%lld",&T);while(T--){scanf("%lld",&n);ans=0;for(ll i=1;i*i<=n;i++){if(n%i)continue;ans=(ans+calc(i))%P;if(i*i!=n)ans=(ans+calc(n/i))%P;}printf("%lld\n",ans);}return 0; }總結(jié)
以上是生活随笔為你收集整理的P4980-[模板]Pólya定理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何清洗手机屏幕
- 下一篇: 英文纯净版盘古越狱工具如何使用