BZOJ1005 HNOI2008 明明的煩惱

2022-09-10 15:36:28 字數 2260 閱讀 9952

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

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

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

-1-1

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

該題運用到了樹的prufer編碼的性質:

(1)樹的prufer編碼的實現

不斷 刪除樹中度數為1的最小序號的點,並輸出與其相連的節點的序號  直至樹中只有兩個節點

(2)通過觀察我們可以發現

任意一棵n節點的樹都可唯一的用長度為n-2的prufer編碼表示

度數為m的節點的序號在prufer編碼**現的次數為m-1

(3)怎樣將prufer編碼還原為一棵樹??

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

該題需要將樹轉化為prufer編碼:

n為樹的節點數,d[ ]為各節點的度數,m為無限制度數的節點數。

所以要求在n-2大小的陣列中插入tot各序號,共有

種插法;

在tot各序號排列中,插第乙個節點的方法有

種插法;

插第二個節點的方法有

種插法;

………另外還有m各節點無度數限制,所以它們可任意排列在剩餘的n-2-tot的空間中,排列方法總數為

;根據乘法原理:

然後就要高精度了…..但高精度除法太麻煩了,顯而易見的排列組合一定是整數,所以可以進行質因數分解,再做一下相加減。

關於n!質因數分解有兩種方法,第一種暴力分解,這裡著重講第二種。

若p為質數,則n!可分解為 乙個數*

,其中

且所以——**怡紅公子

1 #include 2 #include 3 #include 4

struct

bignum

13if (l == 0) l = 1;14

}1516void mul(int

k) while (a[t] >= 10000

);26}27

while (a[l + 1] > 0) l++;28}

2930

void

print()

36};

37int n, m = 0, tot = 0, d[1001], prime[1001], cnt[1001

];38

39bool judge(int

k) 44

45void makelist(int

n) 50

51void compute(int k, int

t) 58 cnt[i] += x *t;59}

60}6162

intmain()

7172

makelist(n);

73 memset(cnt, 0, sizeof

(cnt));

74 compute(n - 2, 1

);75 compute(n - 2 - tot, -1

);76

for (int i = 1; i <= n; i++)

77if (d[i] != -1) compute(d[i] - 1, -1

);78

79 bignum ans = 1;80

for (int i = 1; i <= prime[0]; i++)

81for (int j = 1; j <= cnt[i]; j++)

82ans.mul(prime[i]);

83for (int i = 1; i <= n - 2 - tot; i++)

84ans.mul(m);

85ans.print();

86return0;

87 }

bzoj1005

狡猾的商人 bzoj1202,HNOI2005

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

bzoj1005 hnoi2008 明明的煩惱

time limit 1 sec memory limit 162 mb submit 3157 solved 1262 submit status discuss 自從明明學了樹的結構,就對奇怪的樹產生了興趣.給出標號為1到n的點,以及某些點最終的度數,允許在任意兩點間連線,可產生多少棵度數滿足要...

BZOJ 1005 HNOI2008 明明的煩惱

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