BZOJ 1478&1488&1815&Sgu282同型

エッジカラーリングは、均質で、暴力で頂点置換結果が列挙$ 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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/Mrzdtz220/p/12232133.html