bzoj1211 HNOI2004 樹的計數

2021-08-14 19:20:23 字數 1220 閱讀 3536

題目傳送門

。。解法:

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...