bzoj1005 hnoi2008 明明的煩惱

2021-07-04 06:16:58 字數 1822 閱讀 3240

time limit: 1 sec  

memory limit: 162 mb

submit: 3157  

solved: 1262 [

submit][

status][

discuss]

自從明明學了樹的結構,就對奇怪的樹產生了興趣...... 給出標號為1到n的點,以及某些點最終的度數,允許在任意兩點間連線,可產生多少棵度數滿足要求的樹?

第一行為n(0 < n < = 1000),接下來n行,第i+1行給出第i個節點的度數di,如果對度數不要求,則輸入-1

乙個整數,表示不同的滿足要求的樹的個數,無解輸出031

-1-1

2兩棵樹分別為1-2-3;1-3-2

prufer編碼+高精度+質因數分解

這道題運用了prufer編碼的有關性質:

①實現過程:不斷刪除書中度數為1的最小序號的編點,並輸出與其相連的節點的編號,直至樹中只剩兩個節點。這樣所形成的就是prufer編碼。

②度數為d的節點在prufer編碼中的出現次數為d-1。

③一顆節點數為n的樹轉化為的prufer編碼中有n-2個數。

④將prufer編碼還原成一棵樹的過程:從prufer編碼的最前端開始掃瞄節點,設該節點序號為u ,尋找不在prufer編碼的最小序號且沒有被標記的節點v,連線u和v,並標記v,將u從prufer編碼中刪除。掃瞄下一節點。

綜上,我們可以發現prufer編碼與樹一一對應。所以這道題求滿足條件的樹的個數,也就是求滿足條件的prufer編碼的個數。

設m為無度數限制的節點個數,sum為有度數限制的節點的度數-1的和,即sum=∑(i=1,n) d[i]-1 ,(其中i要滿足d[i]≥1)。

不考慮有度數限制的節點序號的重複,prufer編碼個數為a(n-2,sum)。

有度數限制的節點序號的重複次數為∏(i=1,n) (d[i]-1)! ,(其中i要滿足d[i]≥1)。

所以要滿足有度數限制的節點,prufer編碼個數為

a(n-2,sum)/∏(i=1,n) (d[i]-1)! ,(其中i要滿足d[i]≥1)。

無度數限制的節點序號可以任意的插在prufer編碼中,個數為m^(n-2-sum)。

所以最終答案為 a(n-2,sum)*m^(n-2-sum)/∏(i=1,n) (d[i]-1)! ,(其中i要滿足d[i]≥1)。

顯然可以看出,這裡要用到高精度。由於高精度除法比較難寫,所以我們可以用質因數分解使運算更加簡單。

#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

using namespace std;

int cnt,n,m,x,sum,l,ans[10001],f[1001],d[1001],p[1001];

void prime()

}void calc()

if (ans[l+1]>0) l++;

while (ans[l]>=10)

}}void print()

int main()

prime();

memset(p,0,sizeof(p));

f(i,n-1-sum,n-2) }

x=m;

if (x>1) f(j,1,cnt) while (x%f[j]==0)

f(i,1,n) f(j,1,d[i]-1) }

calc();

print();

}

狡猾的商人 bzoj1202,HNOI2005

ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...

BZOJ 1005 HNOI2008 明明的煩惱

給定一棵n個節點的樹的節點的度數,其中一些度數無限制,求可以生成多少種樹。用到了prufer數列的知識。度娘 prufer數列 是由有乙個對於頂點標過號的樹 標號樹 轉化來的數列,點數為n的樹轉化來的prufer數列長度為n 2。由heinz prufer於1918年在證明cayley定理時首次提出...

BZOJ1005 HNOI2008 明明的煩惱

time limit 1 sec memory limit 162 mb 自從明明學了樹的結構,就對奇怪的樹產生了興趣.給出標號為1到n的點,以及某些點最終的度數,允許在 任意兩點間連線,可產生多少棵度數滿足要求的樹?第一行為n 0 n 1000 接下來n行,第i 1行給出第i個節點的度數di,如果...