題目傳送門
。。解法:
prufer數列。
有這麼三個性質:
乙個prufer數列與乙個無根樹一一對應。
乙個n個節點的無根樹的prufer數列長度為n-2。
乙個點的度數等於他在prufer數列裡面出現的次數+1。。
第三個性質這樣證明:
首先需要了解prufer序列如何構造:
看這裡在prufer數列中,如果乙個點出現了兩次,那麼肯定有兩個點連向他。
那麼還有一次呢。
就是自己連向別人的情況,這種情況是不會把這個點放到prufer數列裡的而會把跟他相連的那個點放到數列裡。
所以度數等於出現次數+1
那麼我們就可以知道每個點在prufer數列中出現的次數了(度數-1)
這樣用組合數學就可以了啊。
直接乘居然會爆。。
網上的題解都說分解質因數,那就分解質因數咯。
**實現;
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
int n;ll d[160];
ll pr[150];int len;
bool pd(ll x)
int s[150];
ll pow_mod(ll a,int b) return ans;}
int main()
for(int i=1;i<=n;i++)if(n>1&&d[i]==0)
if(sum-n!=n-2)
if(n==1&&d[1]!=0)int len=0;
for(ll i=1;i<=150;i++)if(pd(i)==true)pr[++len]=i;
memset(s,0,sizeof(s));
for(int i=1;i<=n-2;i++) }
for(int i=1;i<=n;i++) }
}ll ans=1;for(int i=1;i<=150;i++)ans*=pow_mod(pr[i],s[i]);printf("%lld\n",ans);
return
0;}
bzoj 1211 HNOI2004 樹的計數
題意 給出每個節點的度數,問有多少棵樹滿足這些度數。題解 pr fer序列 組合數學 pr fer序列是由標號樹產生的唯一數列。生成方法 一棵樹要得到普呂弗序列,方法是逐次去掉樹的頂點,直到剩下兩個頂點。考慮樹t,其頂點為。在第i步,去掉標號最小的葉,並把普呂弗序列的第i項設為這葉的鄰頂點的標號。序...
BZOJ 1211 HNOI2004 樹的計數
今天早上由於剩下的非許可權題實在是太難了。於是學了一下新東西續命。直接prufer序列排列組合就好了。注意各種0的情況 code include include typedef long long ll const ll n 155 ll n ll a n ll pri n ll tot ll cn...
bzoj1211 HNOI2004 樹的計數
題目鏈結 乙個有n個結點的樹,設它的結點分別為v1,v2,vn,已知第i個結點vi的度數為di,問滿足這樣的條件的不同的樹有多少棵。給定n,d1,d2,dn,程式設計需要輸出滿足d vi di的樹的個數。prufer序列,明明的煩惱簡化版。bzoj1211 include include inclu...