Bzoj-生成树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bzoj-生成树相关的知识,希望对你有一定的参考价值。

代码两分钟...证明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-生成树的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)

bzoj1083: [SCOI2005]繁忙的都市(最小生成树)

BZOJ 1083: [SCOI2005]繁忙的都市 裸的最小生成树

BZOJ 1016: [JSOI2008]最小生成树计数

BZOJ2521[Shoi2010]最小生成树 最小割

BZOJ 1016 最小生成树计数