【bzoj 2467】[中山市选2010]生成树(数论--排列组合)
题目:有一种图形叫做五角形圈。一个五角形圈的中心有1个由n个顶点和n条边组成的圈。在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形。这些五角形只在五角形圈的中心的圈上有公共的顶点。现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目。还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树。注意:在给定的n五角形圈中所有顶点均视为不同的顶点。
解法:题目是问使这 N 五角形圈生成树的种数。而生成树就是要 N-1 条边,无环。我们的目标就是破环环,也就是各个封闭图形。
首先,我们可以考虑中间的 N边形 一定要删一条边,C(n,1)。再是周围的 N 个五边形,有 N-1 个仍是五边形,各删一条边 C(5,1)^(n-1),有一个只剩四条边,删一条边 C(4,1)。综合起来就是 C(n,1)*C(5,1)^(n-1)*C(4,1) 。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 #define N 110 6 #define mod 2007 7 8 int s[N]; 9 int main() 10 { 11 int x=1; 12 for (int i=1;i<=N-10;i++) 13 { 14 x=(x*5)%mod; 15 s[i]=x; 16 } 17 int T,n; 18 scanf("%d",&T); 19 while (T--) 20 { 21 scanf("%d",&n); 22 printf("%d\n",(n*4*s[n-1])%mod); 23 } 24 return 0; 25 }