https://codeforces.com/contest/1173/problem/D
質問の意味:
あなた与えるツリーは、n個の点、〜nは1番のn点が含まれています。
円与えられ、円は、n番目の位置、ツリー内のi番目のノードに対応する位置に配置され、かつ省略する。
円形に削減ツリーを求めた後、その結果非交差エッジ実施形態の総数。
学習します。https://www.cnblogs.com/violet-acmer/p/10991346.html
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型のmod = 998244353 ; const int型 M = 2E5 + 5 。 構造体ノード{ int型nextt、V。 } E [M << 1 ]。 ベクトル < 整数 > 息子[M]; int型のヘッド[M]、N、TOT。 LLのFAC [M]、DP [M]。 ボイド addedge(INT U、INT V){ E [TOT] .V = V。 E [TOT] .nextt =ヘッド[U]。 ヘッド[U]は ++ TOTを= 。 } ボイド DFS(INT U、INT F){ ため(int型 I =ヘッド[U];〜I; I = E [I] .nextt){ int型、V = E [I] .V。 もし(vは== f)を 続けます。 息子[U] .push_back(V)。 DFS(V、U); } int型フラグ= 0 。 もし(!U = 1 ) フラグ = 1 ; INT K =息子[U] .size()+ フラグ。 DP [U] =FAC [K]。 以下のために(int型 I = 0 ; iが<息子[U] .size(); iが++ ){ DP [U]は DP [U] * DP [息子[U] [I]%= MODと、 } } )({解決ちゃう DFS(1、1 )。 戻り DP [ 1 ] * N%のMODと、 } int型のmain(){ scanf関数(" %のD "、&N) FAC [ 0 ] = 1 ; 用(int型 i = 1 ; iが<= N iが++ ) FACを[i]は =(iは[FAC * I-1 ])%のMOD。 memsetの(頭、 - 1、はsizeof (ヘッド))。 以下のために(int型 i = 1 ; iがn <; iは++ ){ int型Uを、V。 scanf関数(" %d個の%d個"、&U&V); addedge(U、V); addedge(V、U); } のprintf(" %I64d " 、解決())。 リターン 0 ; }