日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P4980-[模板]Pólya定理

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4980-[模板]Pólya定理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接: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×下滿足以下條件的集合

  • 封閉性:若存在a,b∈Ga,b\in Ga,bG那么有a×b∈Ga\times b\in Ga×bG
  • 交換律:若有a,b,c∈Ga,b,c\in Ga,b,cG那么有(a×b)×c=a×(b×c)(a\times b)\times c=a\times (b\times c)(a×b)×c=a×(b×c)
  • 單位元:群中?e∈G\exist e\in G?eG滿足?x∈G\forall x\in G?xG都有x×e=xx\times e=xx×e=x
  • 逆元:對(duì)于?x∈G\forall x\in G?xG都有一個(gè)唯一元素y∈Gy\in GyGx×y=ex\times y=ex×y=e
  • 然后中間一些東西很多很雜這里不多說(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)G1?fG?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)}G1?fG?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=0n?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?dn?mdi=1dn??[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?dn?ndφ(dn?)=dn?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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。