题目描述
有一种图形叫做五角形圈。
一个五角形圈的中心有1个由n个顶点和n条边组成的圈。在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形。这些五角形只在五角形圈的中心的圈上有公共的顶点。如图0所示是一个4-五角形圈。
现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目。还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树。
注意:在给定的n五角形圈中所有顶点均视为不同的顶点。
输入格式
输入包含多组测试数据。
第一行包含一个正整数T,表示测试数据数目。
每组测试数据包含一个整数n( 2<=N<=100),代表你需要求解的五角形圈中心的边数。
输出格式
对每一组测试数据,输出一行包含一个整数x,表示n五角形圈的生成树数目模2007之后的结果。
样例数据
input
1
2
output
40
数据规模与约定
保证a,b≤10^9。
时间限制:1s
空间限制:256MB
题解
首先,对于题目所给的这个五角星圈,一共有 4 n 4n 4n 个点和 5 n 5n 5n 条边。
根据生成树的定义,必须满足 点数 = 边数 + 1。因此需要删去 n − 1 n-1 n−1条边。
我们现在需要考虑如何删边:
- 显然,对于凸起的每一个无边形,必须要删去一条边,否则构成环。
- 还剩下一条边需要删除,必须删除中间的那一圈,否则必然有一条边被孤立、无法联通。
- 此时我们需要对 ( n − 1 ) (n-1) (n−1)个凸起删去一条边,对 1 1 1个凸起删去两条边且一条边固定。
此时我们考虑如何用数学来计算方案数。
- 对于删去两条边的那个凸起,每一个凸起只有 4 4 4中方案因为剩下的是固定的。但是有 n n n个凸起可以选择,所以是 4 ∗ n 4*n 4∗n。
- 对于剩下的 ( n − 1 ) (n-1) (n−1)个凸起,都有 5 5 5中情况可以选择,所以方案数是 5 n − 1 5^{n-1} 5n−1
所以最后的答案(或结论)就是:
a
n
s
=
4
n
∗
5
n
−
1
ans\ =\ 4n\ *\ 5^{n-1}
ans = 4n ∗ 5n−1
还有需要注意的是遇到这种题目,要从题目的性质中发掘性质,得到结论后列出算式。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int P=2007;
int main(void)
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
int T;
scanf("%d",&T);
while (T --)
{
int n;
scanf("%d",&n);
int ans=(n*4) % P;
for (int i=1;i<n;++i)
ans*=5,ans%=P;
printf("%d\n",ans);
}
return 0;
}