有一种图形叫做五角形圈。一个五角形圈的中心有1个由n个顶点和n条边组成的圈。在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形。这些五角形只在五角形圈的中心的圈上有公共的顶点。如图0所示是一个4-五角形圈。
现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目。还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树。
注意:在给定的n五角形圈中所有顶点均视为不同的顶点。
标签:line 数据包 == 正整数 测试数据 log ret string zoj
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接 :http://www.lydsy.com/JudgeOnline/problem.php?id=2467
输入包含多组测试数据。第一行包含一个正整数T,表示测试数据数目。每组测试数据包含一个整数n( 2<=N<=100),代表你需要求解的五角形圈中心的边数。
对每一组测试数据,输出一行包含一个整数x,表示n五角形圈的生成树数目模2007之后的结果。
分析:
组合问题,乘法原理。
对于n五角形圈来说,要形成一棵树,需要满足两个条件:1.无环且连通 2.从5*n条边 -->4*n-1条边
也就是说,我们要先从每个五角形圈中去掉一条边,然后在一个五角形圈中再去一条边。
也就是从n-1个五角形圈中去掉一条边,然后在一个五角形圈中去掉两条边(其中一条必定在中心n边形上,否则无法保证连通)。
步骤一方案数:5^(n-1) 步骤二方案数:4
又由于去掉两条边的五边形可以是所有五边形中的任意一个,方案数*n
总方案数:4*n*5^(n-1)
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 const long long MOD = 2007; 7 8 inline void read(long long &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 12 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 13 if(c == ‘-‘) x = -x; 14 } 15 16 long long n,T; 17 18 long long ksm(long long a,long long b) 19 { 20 long long base = a,ans = 1; 21 for(;b;b>>=1) 22 { 23 if(b&1) 24 ans = ans*base%MOD; 25 base = base*base%MOD; 26 } 27 return ans; 28 } 29 30 inline void calc(long long n) 31 { 32 long long ans = 4*n%MOD; 33 ans = ans*ksm(5,n-1)%MOD; 34 printf("%lld\n",ans); 35 } 36 //公式:4*n*5^(n-1) 37 int main() 38 { 39 read(T); 40 for(int i = 1;i <= T;++ i) 41 { 42 read(n); 43 calc(n); 44 } 45 return 0; 46 }
标签:line 数据包 == 正整数 测试数据 log ret string zoj
原文地址:http://www.cnblogs.com/shingen/p/7628062.html