Codeforces 1172B(組合せ論)

フェイス質問

n個の点の木を与え、それに描かれた円を必要とし、エッジが交差しない、構成描画対応(すなわち、同じオペレータの異なる種類の回転)、プログラムの数を見つけます。フォーポイントツリー以下の図\(T:V = \ { 1,2,3,4 \}、E = \ {(1,2)、(1,3)、(2,4)\} \ 解決策:

元のタイトルのCFからの画像

codeforcesタイトル説明から写真

分析

xのサブツリーのために、我々はそうでない状況は以下の図が表示されます、サブツリーのノードxが円上の連続区間でなければなりません見つけます

[x]は、xは度を表し、42度に設けられ

非ルートXの場合:

そこ度X [X] -1息子、プログラムが配置された息子の\((DEGは、[X] -1)!\)種、次いで息子息子とルートに任意の合計℃に隣接する位置に挿入[x]は空の、総答えは((DEG [X] -1 \ [X]!\)!\回度[X] =゜)

ルートXの場合:

Xの位置自体は、必要に応じてNが゜.X [X]息子が配置スキーム有する、円周上に置換されていてもよい\を(N゜回\ [X ]!\)

従って、プログラムの総数\(N \倍\ prod_ { i = 1} ^ N°(I)!\)

コード

#include<iostream>
#include<cstdio>
#define maxn 200005
#define mod 998244353
using namespace std;
int n;
long long fact[maxn];
int deg[maxn];

int main(){
    int u,v;
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        scanf("%d %d",&u,&v);
        deg[u]++;
        deg[v]++; 
    }
    fact[0]=1;
    for(int i=1;i<=n;i++){
        fact[i]=fact[i-1]*i%mod;
    }
    long long ans=1;
    for(int i=1;i<=n;i++){
        ans*=fact[deg[i]];
        ans%=mod;
    }
    ans*=n;
    ans%=mod;
    printf("%I64d\n",ans);
}

おすすめ

転載: www.cnblogs.com/birchtree/p/10990067.html