Travel(思維題 組合數)
阿新 • • 發佈:2018-12-13
這場牛客爆一,從這道題卡到結束,中間睡覺+自閉+放棄。
賽後學姐三兩句話就講懂了,很簡單的一道題。
比賽的時候自己已經想過了,如果能夠找出把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; }