题意简述
定义"五角形圈"为一个长度为
n
n
n的环,每一条边都画一个正五边形,形成的图形。给定
n
n
n,求长度为
n
n
n的环形成的"五角形圈"的生成树有多少种(每个点都是不一样的)?
(如下图是一个
4
4
4条边形成的"五角形圈")
(bzoj上盗的图)
数据
输入
第一行是一个
T
T
T,表示有
T
T
T组数据
接下来
T
T
T行,每行一个
n
(
2
<
=
n
<
=
100
)
n(2<=n<=100)
n(2<=n<=100)。
输出
T T T行,第 i i i行是第 i i i次询问的答案。
样例
输入
1
2
输出
40
思路
看到这个题的第一反应:wdnmd中山还有市选???
emmm。。。说正事。这个题一看就是一个大组合题。。。应该是有一个公式的,是什么呢?来♂一起推♂公♂式♂。
由于我是个蒟蒻,我一开始想了一个不太正确的思路:我枚举中间那个环上用了多少个边。数着数着,我发现。。。越到后面越不好数,而且还要累加,万一
T
T
T一大。。。珂能就挂了。。。
所以我开始换了一种枚举方法:枚举四周的五边形的情况。现在,我来还原一下我当时的思路轨迹。先把4-五角形圈的那个图画在 桌子(我们学校桌子珂以用铅笔在上面写草稿,虽然破坏公物不好,但为了信息竞赛,不管了) 草稿纸上。
然后我们删掉一些边。由于每个五边形都组成一个环,所以考虑枚举五边形,去删边。从正上方那个开始,顺时针枚举五边形开始删边(如红色箭头所示)。蓝色表示删去的边。
删到第三个,如果我们不考虑最左边那个,删去的边已经形成一个树了。此时我们完成了删
n
−
1
n-1
n−1个的任务,由于
n
−
1
n-1
n−1个五边形每个都有
5
5
5条边(废话),所以每个都有
5
5
5种选择(
5
5
5条边中任选一个删除,即可让前
n
−
1
n-1
n−1个形成树)。到此就是
5
n
−
1
5^{n-1}
5n−1种。
但是,对于最后一个,不是删
1
1
1个就珂以形成树的。似乎。。。要删两个。而且我们会发现,紫色所示的那条边还必须删除,因为剩下
n
−
1
n-1
n−1个五边形让中间的那个环的剩下
n
−
1
n-1
n−1个点联通,如果此时在多连一条边,就变成环了,不满足条件,所以紫色的一定要删。剩下还有
4
4
4种选择(蓝色表示的是其中一种)。如下图所示
然后我们会发现,还没考虑完。题目中说每个点都是不一样的,所以最后剩下的那个五边形是哪个都有珂能,并且都会生成不一样的树。所以还要乘
n
n
n。
这样一总和,答案就是 4 n × 5 n − 1 4n\times 5^{n-1} 4n×5n−1。打个快速幂就过了。
代码:
#include<bits/stdc++.h>
using namespace std;
namespace Flandle_Scarlet{
#define mod 2007
int qpow(int a,int b,int m)//a^b%m
//快速幂
{
int r=1;
while(b)
{
if (b&1) r=r*a%m;
a=a*a%m,b>>=1;
}
return r;
}
void Main()
{
int T;scanf("%d\n",&T);
while(T--)
{
int n;
scanf("%d",&n);
printf("%d\n",4*n*qpow(5,n-1,mod)%mod);
//解释过了
}
}
}
int main()
{
Flandle_Scarlet::Main();
return 0;
}