[jzoj2196]【中山市选2010】生成树

版权声明:本文为博主原创文章,转载时请标明出处。 https://blog.csdn.net/FarmerJohnOfZS/article/details/78938214

Description

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

Solution

最显然的一题。

变成生成树,相当于使它没有环。

每个小五边形都是独立的,因此各切一条边 方案数 5n

发现还是有一个大环于是再切一条边

发现大环的 size 不一定所以求个期望 size = 4/5n

数据范围为什么这么小我也不知道

Code

#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define fo(i,x,y) for (int pq = (y),i = (x);i <= pq;++ i)
#define fd(i,x,y) for (int pq = (y),i = (x);i >= pq;-- i)
#define oo 2139062143
using namespace std;
typedef double db;
typedef long long ll;
int lowbit(int x) {return((x)&(-x));}
int min(int x,int y){return (x>y)?(y):(x);}
int max(int x,int y){return (x>y)?(x):(y);}
const int N=110,Mo=2007;
int n,T;
int qsm(int a,int b)
{
    int x=1;
    a%=Mo,b%=(Mo-1);
    while(b)
    {
        x=((b&1))?((1ll*x*(a))%Mo):(x);
        b>>=1,a=(1ll*a*a)%Mo;
    }
    return x;
}
int main()
{
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int ans=(4ll*n*qsm(5,n-1))%Mo;
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/FarmerJohnOfZS/article/details/78938214