1. 程式人生 > >Travel(思維題 組合數)

Travel(思維題 組合數)

這場牛客爆一,從這道題卡到結束,中間睡覺+自閉+放棄。

賽後學姐三兩句話就講懂了,很簡單的一道題。

比賽的時候自己已經想過了,如果能夠找出把n個城市分成m份,每份都是連通的,那麼這種分類的數量,再乘它的全排列,也就是m的階乘就是答案,然後就在如何確保“分割出來的m份每份聯通”這個問題上玩命地想,想著想著就覺得自己的知識儲備不夠不會圖論的高階方法,慢慢地開始放棄。

但是想到這裡已經距離答案非常接近了。實際上把它分成符合條件的m份,只需要從n-1條邊中挑出m-1條,自然地就分割出來了。很容易想,類似高中排列組合題目中的“隔板法”,不同的是這裡是“斷邊法”,斷一條邊就能分割出一份來,而且這樣斷邊是能夠保證分割出來的每一份都滿足條件的。

答案就是C[n-1][m-1]*(m!),組合數的分母可以和m!約分。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int _n=1e9+7;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n-1;i++)
            {
                int a ,b;
                scanf("%d%d",&a,&b);
            }
        ll x=1;
        for(int i=0;i<m-1;i++)
        {
            x*=(n-1-i);
            x%=_n;
        }

        cout<< x*m % _n <<endl;
    }
    return 0;
}