【bzoj 2467】[中山市选2010]生成树(数论--排列组合)

本文介绍了一种特殊图形——五角形圈,并探讨了如何计算这种图形的不同生成树的数量。通过删除特定数量的边来打破原有的环状结构,确保最终图形形成一棵树。文章还提供了一个C++实现的示例程序。

题目:有一种图形叫做五角形圈。一个五角形圈的中心有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 }

 

转载于:https://www.cnblogs.com/konjak/p/6071090.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值