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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[luogu4128][shoi2006]有色图

發布時間:2024/4/11 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [luogu4128][shoi2006]有色图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

計數題

題目相關

題目鏈接

題目大意

nnn個點的完全圖,對邊染色(顏色有mmm種),求本質不同的染色方案數,答案對ppp取模

數據范圍

1≤n≤53,1≤m≤1000,1≤p≤1091\le n\le53,1\le m\le1000,1\le p\le10^91n53,1m1000,1p109

題解

我們乍一看是染色問題,我們就想到了Polya定理
l=1∣G∣∑ai∈Gkλ(ai)l=\frac{1}{|G|}\sum_{a_i\in G}k^{\lambda(a_i)}l=G1?ai?G?kλ(ai?)
我們可以用其式子來計算
但是我們發現染色的是邊而不是點,而是邊,所以我們計算的置換是對于邊的
我們考慮先不枚舉邊置換,而是枚舉點的置換,容易發現,一個點置換,其對應的邊置換是唯一確定的
這樣一來,就有了方便的枚舉置換方式
我們發現,點的置換有n!n!n!種,我們發現53!53!53!的復雜度顯然不能接受
我們考慮不直接枚舉所有點置換,而是枚舉本質不同的點置換,本質相同的點置換,對應的邊置換也是本質相同的
這樣的話復雜度就是nnn的整數劃分了,隨便寫個程序就可以發現當n=53n=53n=53時,整數劃分是3?1053*10^53?105級別的,目前看起來可以接受
code

#include<cstdio> #include<cctype> #define rg register template<typename T>inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template<typename T>inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template<typename T>inline void print(const T x){if(x>=0)printe(x);else putchar('-'),printe(-x);} int n,ans; void dfs(const int t,const int h) {if(t==0)ans++;else for(rg int i=h;i<=t;i++)dfs(t-i,i); } int main() {read(n);dfs(n,1);print(ans);return 0; }

我們考慮現在得到了一個整數劃分,其有kkk個循環,按循環長度排序后的第iii個循環長度為LiL_iLi?L1≤L2≤???≤LkL_1\le L_2\le···\le L_kL1?L2????Lk?
我們思考對于這樣一個點置換,其對應的邊置換的循環數量(在Polya中要求的東西)
兩個端點在同一個長度為LLL的點循環內的情況:
我們發現,對于任意一條邊,將其兩邊的點轉動,這樣就可以產生一個大小為LLL的邊循環
然后這個時候有個特例,當LLL為偶數時,有一個大小為L2\frac{L}{2}2L?的循環,即環上每組相對的點所組成的循環
即:
LLL為奇數時,循環數為(L2)L=L?(L?1)/2L=L?12\frac{\binom{L}{2}}{L}=\frac{L*(L-1)/2}{L}=\frac{L-1}2L(2L?)?=LL?(L?1)/2?=2L?1?
LLL為偶數時,循環數為(L2)+L2L=L?(L?1)/2+L/2L=L2\frac{\binom{L}{2}+\frac{L}{2}}{L}=\frac{L*(L-1)/2+L/2}{L}=\frac L2L(2L?)+2L??=LL?(L?1)/2+L/2?=2L?
綜上,這里的邊循環數為?L2?\left\lfloor\frac L2\right\rfloor?2L??
兩個端點分別在長度為LaL_aLa?LbL_bLb?的點循環內的情況:
容易發現,這里的邊循環長度為lcm(La,Lb)lcm(L_a,L_b)lcm(La?,Lb?)
那么循環數量為La?Lblcm(La,Lb)=gcd(La,Lb)\frac{L_a*L_b}{lcm(L_a,L_b)}=gcd(L_a,L_b)lcm(La?,Lb?)La??Lb??=gcd(La?,Lb?)

這樣的話,對于一個枚舉到的本質不同的點循環,其對Poyla定理中后面那個sigma的指數CCC就為
C=∑i=1k?Li2?+∑i=1k∑j=i+1k(Li,Lj)C=\sum_{i=1}^k\left\lfloor\frac {L_i}2\right\rfloor+\sum_{i=1}^k\sum_{j=i+1}^k(L_i,L_j)C=i=1k??2Li???+i=1k?j=i+1k?(Li?,Lj?)
我們也知道顏色數,現在還需要統計這種點循環的出現次數
容易發現,出現次數SSS可以直接計算
我們設TiT_iTi?為長度為iiiLLL出現的次數(另外,定義0!=10!=10!=1
S=∏i=1k(Li?1)!(n?∑j=1i?1LjLi)∏i=1nTi!=n!∏i=1nTi!?∏i=1kLiS=\frac{\prod_{i=1}^k(L_i-1)!\binom{n-\sum_{j=1}^{i-1}L_j}{L_i}}{\prod_{i=1}^{n}T_i!}=\frac{n!}{\prod_{i=1}^{n}T_i!*\prod_{i=1}^{k}L_i}S=i=1n?Ti?!i=1k?(Li??1)!(Li?n?j=1i?1?Lj??)?=i=1n?Ti?!?i=1k?Li?n!?
這樣的話我們就能快速的求出SSS
最終答案就可以算出來了
l=S?mCn!l=\frac{S*m^C}{n!}l=n!S?mC?

代碼

這份代碼為了方便理解,寫的復雜度比較大,實際可以有更好的寫法使程序跑得更快

#include<cstdio> #include<cctype> #define rg register typedef long long ll; template<typename T>inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template<typename T>inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template<typename T>inline void print(const T x){if(x>=0)printe(x);else putchar('-'),printe(-x);} template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);} ll n,m,p,L[61],fac[61],ans,tim[61]; inline ll pow(ll x,ll y) {ll res=1;for(;y;y>>=1,x=x*x%p)if(y&1)res=res*x%p;return res; } void dfs(const int step,const int t,const int h) {if(t==0){ll xs=0,xf=1;for(rg int i=1;i<step;i++){xs+=L[i]>>1;for(rg int j=i+1;j<step;j++)xs+=gcd(L[i],L[j]);xf=xf*L[i]%p;}for(rg int i=1;i<=n;i++)xf=xf*fac[tim[i]]%p;ans+=pow(m,xs)*pow(xf,p-2)%p;}else for(rg int i=h;i<=t;i++){L[step]=i;tim[i]++;dfs(step+1,t-i,i);tim[i]--;} } int main() {read(n),read(m),read(p);fac[0]=1;for(rg int i=1;i<=60;i++)fac[i]=fac[i-1]*i%p;dfs(1,n,1);print(ans%p);return 0; }

總結

代碼非常的清真,良好的計數技巧配上Poyla定理就能解決這題
計數好難

總結

以上是生活随笔為你收集整理的[luogu4128][shoi2006]有色图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久国产精品久久 | 日本少妇xxxx | 欧美一区二区三区粗大 | 福利视频在线 | 天天色综合av | www.色图| 日本视频www色 | 国产91在线高潮白浆在线观看 | 日韩欧美国产激情 | 日日干夜夜干 | 国产精品无码中文 | 一级欧美黄色片 | 伊人春色在线视频 | 欧美日韩激情一区 | 天天操天天舔天天干 | 天天干夜夜爱 | 99精品欧美一区二区三区综合在线 | 怡红院av亚洲一区二区三区h | 亚洲成人99 | 欧美91视频 | 综合亚洲视频 | 情不自禁电影 | av手机免费观看 | 国产精品久久久久久亚洲调教 | 热久久久| 精品夜夜澡人妻无码av | 影音av资源 | 少妇户外露出[11p] | 日本xxx在线播放 | 久久婷五月天 | 丰满人妻一区二区三区53号 | 夜夜爽www | 激情网站在线 | 春色激情站| 久久国产一二三 | 九九热久久免费视频 | 日日干天天 | 天天色影| 成年人免费网站 | 久久噜噜 | 91调教视频 | 人妻少妇精品无码专区 | 欧美日韩伊人 | 日韩免费视频网站 | 国产精品久久婷婷 | 色婷婷国产精品综合在线观看 | 奇米色在线 | 国产精品一线二线三线 | 乱lun合集男男高h | a√在线| 97国产精品人人爽人人做 | 永久免费看成人av的动态图 | 欧美精品在线观看视频 | 午夜两性网| 亚洲欧洲免费 | 草逼导航 | www.97超碰 | 人妻精油按摩bd高清中文字幕 | 国产欧美视频在线播放 | 91大神在线观看视频 | 久草免费网站 | 国产三级网 | 亚洲一区欧美 | 亚洲一区免费看 | 麻豆视频网 | 欧美18av| 国产在线观看免费av | 久久99网站| 日韩国产综合 | 中国色老太hd | 亚洲色偷偷综合亚洲av伊人 | 风间由美一区二区 | 日本69av| 日日涩 | 色综合狠狠操 | 精品少妇一区二区三区免费观看 | 丰满熟妇人妻av无码区 | 亚洲无码乱码精品国产 | 18成人免费观看网站 | 在线观看高清视频 | 四虎4hu永久免费网站影院 | 亚洲精品第二页 | 婷婷色av| 欧美一级高清片 | 男人的天堂2019 | 91亚洲精品视频 | 日韩欧美在线观看一区二区三区 | 伊人久久大香线蕉综合网站 | 99热只有这里有精品 | 日日插夜夜爽 | 丁香花在线影院观看在线播放 | 成人av社区 | 荷兰女人裸体性做爰 | 日韩美女视频在线观看 | 动漫美女被吸乳奶动漫视频 | 国产精品福利在线播放 | 日本成人一二三区 | 欧洲熟妇精品视频 | 亚洲激情二区 |