1. 程式人生 > >BZOJ 2467: [中山市選2010]生成樹 題解

BZOJ 2467: [中山市選2010]生成樹 題解

while class 同時 problem 生成樹 否則 問題 main tro

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接 :http://www.lydsy.com/JudgeOnline/problem.php?id=2467

Description

有一種圖形叫做五角形圈。一個五角形圈的中心有1個由n個頂點和n條邊組成的圈。在中心的這個n邊圈的每一條邊同時也是某一個五角形的一條邊,一共有n個不同的五角形。這些五角形只在五角形圈的中心的圈上有公共的頂點。如圖0所示是一個4-五角形圈。 現在給定一個n五角形圈,你的任務就是求出n五角形圈的不同生成樹的數目。還記得什麽是圖的生成樹嗎?一個圖的生成樹是保留原圖的所有頂點以及頂點的數目減去一這麽多條邊,從而生成的一棵樹。 註意:在給定的n五角形圈中所有頂點均視為不同的頂點。

Input

輸入包含多組測試數據。第一行包含一個正整數T,表示測試數據數目。每組測試數據包含一個整數n( 2<=N<=100),代表你需要求解的五角形圈中心的邊數。

Output

對每一組測試數據,輸出一行包含一個整數x,表示n五角形圈的生成樹數目模2007之後的結果。

Sample Input

1
2

Sample Output

40

分析:

組合問題,乘法原理。

對於n五角形圈來說,要形成一棵樹,需要滿足兩個條件:1.無環且連通  2.從5*n條邊 -->4*n-1條邊

也就是說,我們要先從每個五角形圈中去掉一條邊,然後在一個五角形圈中再去一條邊。

也就是從n-1個五角形圈中去掉一條邊,然後在一個五角形圈中去掉兩條邊(其中一條必定在中心n邊形上,否則無法保證連通)。

步驟一方案數:5^(n-1)   步驟二方案數:4

又由於去掉兩條邊的五邊形可以是所有五邊形中的任意一個,方案數*n

總方案數:4*n*5^(n-1)

AC代碼:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 const long long MOD = 2007;
7 8 inline void read(long long &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch < 0 || ch > 9) c = ch,ch = getchar(); 12 while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar(); 13 if(c == -) x = -x; 14 } 15 16 long long n,T; 17 18 long long ksm(long long a,long long b) 19 { 20 long long base = a,ans = 1; 21 for(;b;b>>=1) 22 { 23 if(b&1) 24 ans = ans*base%MOD; 25 base = base*base%MOD; 26 } 27 return ans; 28 } 29 30 inline void calc(long long n) 31 { 32 long long ans = 4*n%MOD; 33 ans = ans*ksm(5,n-1)%MOD; 34 printf("%lld\n",ans); 35 } 36 //公式:4*n*5^(n-1) 37 int main() 38 { 39 read(T); 40 for(int i = 1;i <= T;++ i) 41 { 42 read(n); 43 calc(n); 44 } 45 return 0; 46 }

BZOJ 2467: [中山市選2010]生成樹 題解