码迷,mamicode.com
首页 > 其他好文 > 详细

Bzoj-生成树

时间:2017-07-26 01:56:25      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:span   一个   line   lap   www   cto   --   ext   div   

代码两分钟...证明2小时(雾

这道题简单来说就是:要想很久但是代码一下子就能打完...

首先看数据范围猜算法系列--猜不出来...

接着看题...求生成树数目,转向百度,得到一个叫做matrix tree定理的东西...看完一脸懵啊...不会写...

算了既然点开还是写一写吧...

突然发现不用这个屮艸芔茻定理...爽!

观察一波,发现是某个完全联通图...生成树的性质是n个点n-1条边...

看这个图我们可以很容易(个屁)地发现,我们只要在n-1个五边形里删除1条边,再第1个五边形你删除2条边就可以生成树了

首先删掉2条边的五边形一共有n种选择...然后我们又可以发现,2条边里面肯定有一条在中间的n边形中...然后五边形中剩余的4条边里取一条和它组合那就有4种情况啦,所以删除两条边的一共有4n种情况

然后删除1条边的就有n-1个啦...每个五边形中有五种情况...n-1个就是5^(n-1)种搭配情况啦即C(5*(n-1),n-1);

于是答案就是4*n+5^(n-1)...

证毕,博主卒...

第一次一次过...

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>

using namespace std;

#define mod 2007
#define ll long long

ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}

ll pow_mod(ll a,ll b){
	a=a%mod;
	ll ans=1; 
	while(b){
		if(b&1) ans=ans*a%mod,b--;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}

int main(){
	ll t=read();
	while(t--){
		ll n=read();
		printf("%lld\n",4*n%mod*pow_mod(5,n-1)%mod);
	}
}

我的推理好菜啊...我好菜啊QAQ

2017-07-25 23:24:

Bzoj-生成树

标签:span   一个   line   lap   www   cto   --   ext   div   

原文地址:http://www.cnblogs.com/Jrzn/p/7237123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!