BZOJ 2467: [中山市选2010]生成树 [组合计数]

2467: [中山市选2010]生成树

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 638  Solved: 453
[Submit][Status][Discuss]

Description

有一种图形叫做五角形圈。一个五角形圈的中心有1个由n个顶点和n条边组成的圈。在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形。这些五角形只在五角形圈的中心的圈上有公共的顶点。如图0所示是一个4-五角形圈。
 
现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目。还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树。
注意:在给定的n五角形圈中所有顶点均视为不同的顶点。

Input

输入包含多组测试数据。第一行包含一个正整数T,表示测试数据数目。每组测试数据包含一个整数n( 2<=N<=100),代表你需要求解的五角形圈中心的边数。

Output

对每一组测试数据,输出一行包含一个整数x,表示n五角形圈的生成树数目模2007之后的结果。

 


 

这种题随便画画就出来了.....

原本5n条边,需要变成4n点4n-1边

发现每个五边形外围的4条边最多选一条,内部的边可选可不选

每个选完一条边后还要再额外选一条边变成树,说明有一个五边形选了一条外围一条内部

$ans=5^{n-1}*4n$因为选两条边的五边形有n种选择

 

注意一点,这样不会出现不连通,因为外围点的度数为2我们只选了一条,内部点度数为4我们最多选附近3条

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int MOD=2007;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int n;
int Pow(int a,int b){
    int re=1;
    for(;b;b>>=1,a=a*a%MOD)
        if(b&1) re=re*a%MOD;
    return re;
}
int main(){
    int T=read();
    while(T--){
        n=read();
        printf("%d\n",Pow(5,n-1)*4*n%MOD);
    }
}

 

 

 

 

 

 

posted @ 2017-02-16 09:35  Candy?  阅读(266)  评论(0编辑  收藏  举报