エッジカラーリングは、均質で、暴力で頂点置換結果が列挙$ nを交換しました!$種を、同じ変位貢献を持っているどのように多くの検討します。
ポイントの置換、頂点$ U $ $ F:U \ Pに[ U] $、 エッジ$(u、v)は$置換の$ F「:( U、V) \に(P [U] 、P [V])$。
$ U、1サイクルで同時にV $は、$ $ L、このエッジ$の周期長は、(u、v)は$は$ \ lfloor \ FRAC {L}のサイクル数である場合 、{2} \ rfloor $は。
場合$ U、Vはそれぞれ$、$ L_1 $の長さを、$(u、v)が形成された$サイクル長は$ \テキスト{LCM}(L_1である$ L_2は$サイクルである場合 、L_2)$ Aを循環させます$ \ GCD(L_1、L_2)の数 $。
のみ$ L $程度とサイクル数は、$ L $を構成方法を確認することができます。
今、いくつかのサイクルに分けN- $ $の頂点があります。$ M $サイクル、$ L_1、L_2の各サイクルの長さ、と...、L_m $、 どこ$ 0 <L_1 \当量L_2 \当量... \当量L_m $、$ L_1 + L_2 + ... + L_m = N $。
ポイントシステムを決定した後、どのように多くの交換について尋ねます。
ボックスにN- $ $ $ M $の要素に対応し、各ボックスサイズL_iを$ $、プログラム番号$ \ FRAC {N!} { L_1!L_2!... L_m!} $、 それぞれ!$(L_iを- 1)と箱$順列モード、プログラム番号$ \ FRAC {N!} { L_1L_2 ... L_m} $、 $ L_iを= L_ {I + 1の場合 } = .. 。= L_ {I + K - 1} $、 違いはありません$ K $ボックスが、あなたは$ K $で割りました!
したがって、$ L_1 ... L_m $を求め、そこ$$ \ {L_1L_2 ... L_mk_1!K_2 !... K_T!} Fracの{N!} $$
L $ $ $ $ Tことが$ T $を示すことを特徴とする請求値の種類は、それぞれの値は、$ K_I $時間がありました。
このチャネルのエッジにBZOJ1488図同型グラフの対応を二色に感染して、白色のエッジの存在を示し、黒表しNO側がケースに$ $ M = 2ではありませんがあります。
<ビット/ STDC ++ H>の#include の#define LL長い長のconst int型 N = 100 。 整数N、M、MOD。 INT FAC [N]、回答、TOL。 INT NUM [N]、CNT [N]。INT GCD(INT A、int型B){ ながら(B){%= B。 STD ::スワップ(B) } を返します。 } INT QP(INT A、int型 B = MOD - 2 ){ int型 ANS = 1 。 同時に (B){ 場合(B&1)ANS = 1LL * ANS%MOD。= 1LL * *%MOD。 B >> = 1 。 } 戻りANS。 } ボイド馬(INT&){ 場合(> = MOD) - = MOD。 もし(< 0)+ = MOD。 } テンプレート < クラス T> ボイドメガビット(T&){ 静的 のconst int型 MOD = MOD - 1 。 A%= MOD。 もし(A> = MOD) - = MOD。 もし(< 0)、A + = MOD。 } ボイド DFS(int型 CUR、INTは{左) 場合(!は{左) INT A = 1 。 LL B = 0 。 用(INTは iは= 1 ; I <= TOL; I ++ ){ A = 1LL * QP(NUM [i]は、CNT [I])%MOD * FAC [CNT [I]%MOD。 B + = CNT [I] *(CNT [I] - 1)/ 2* NUM [I] + NUM [I] / 2 * CNT [i]は、 用(INT J = I + 1、J <= TOL; J ++ ) B + = CNT [I] * CNT [J] * GCD(NUM [i]は、NUM [J])。 } = 1LL * FAC [N] * QP()%MOD。 MB(B)。 MA(ANS + = 1LL * QP(M、(INT)b)の%MOD)。 } であれば(CUR>左)のリターン; DFS(CUR + 1 、左)。 以下のために(int型私は= 1 ; I * CUR <=左; I ++){ ++ TOL。 NUM [TOL] = CUR。CNT [TOL] = I。 DFS(CUR + 1は、左- I * CUR)。 - TOL; } } int型のmain(){ scanf関数(" %D%D%D "、&N、&M、&MOD)。 用(INT I = FAC [ 0 ] = 1 ; I <N; I ++ ) FAC [i]は = 1LL * I * FAC [I - 1 ]%MOD。 DFS(1 、N) printf(" %のLLD \ N "、1LL *回答* QP(FAC [N])%MOD)。 リターン 0 ; }