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]繁忙的都市(最小生成树)