bzoj 4401 塊的計數

2022-09-14 19:15:09 字數 1626 閱讀 6517

time limit: 10 sec  memory limit: 256 mb

submit: 474  solved: 277

[submit][status][discuss]

小y最近從同學那裡聽說了乙個十分牛b的高階資料結構——塊狀樹。聽說這種資料結構能在sqrt(n)的時間內維護樹上的各種資訊,十分的高效。當然,無聊的小y對這種事情毫無興趣,只是對把樹分塊這個操作感到十分好奇。他想,假如能把一棵樹分成幾塊,使得每個塊中的點數都相同該有多優美啊!小y很想知道,能有幾種分割方法使得一棵樹變得優美。小y每次會畫出一棵樹,但由於手速太快,有時候小y畫出來的樹會異常地龐大,令小y感到十分的苦惱。但是小y實在是太想知道答案了,於是他找到了你,乙個天才的程式設計師,來幫助他完成這件事。

第一行乙個正整數n,表示這棵樹的結點總數,接下來n-1行,每行兩個數字x,y表示編號為x的結點與編號為y的結點相連。結點編號的範圍為1-n且編號兩兩不同。

一行乙個整數ans,表示所求的方案數。

61 2

2 32 4

4 55 6

3100%的資料滿足n<=1000000。

首先最好發現的乙個性質是塊的大小必須得是n的約數。。。不然都不能整除肯定分不出來。。。

同時,當塊的大小一定的時候,也只能有一種分法(最底層只可能是完整的子樹,只有一種分法,而這些子樹的分法一旦確定了它們的祖先的也就確定了)

雖然對於隨機資料來說,n的約數個數是log(n)級別的(考慮調和級數的複雜度計算以及它的意義是1-n的約數個數和),暴力列舉約數+dfs就可以過了。

但是你覺得出題人可能會這麼良心嗎hhhhh,肯定會有那種約數個數趨近於sqrt(n)的n。。。

假如塊的大小確定為k了,那麼只有那些子樹節點個數是k的倍數的點才可能作為乙個塊的根。

而這種節點必須得有n/k個才行(最多也只能有n/k個了)。

如果小於n/k個的話顯然不行,因為可能是根的都沒有n/k個最後肯定分不出來。

那麼為什麼有n/k個滿足條件的點就肯定能行呢???

很顯然的一點是如果乙個滿足條件的節點的子樹大小為2*k,那麼它裡面肯定會有乙個子樹大小為k的後代。。。

因為如果沒有的話滿足條件的點就到不了n/k個。

其他情況類似,意識流證明一下就好了hhhhh

#include#define ll long long

#define maxn 1000005

#define pb push_back

using

namespace

std;

vector

g[maxn];

int n,m,siz[maxn],num=0

;int tot[maxn],***[1005],ans=0

;void dfs(int x,int

fa) tot[siz[x]]++;

}inline

void

prework()

}inline

void

solve()

}int

main()

dfs(

1,1);

solve();

printf(

"%d\n

",ans);

return0;

}

BZOJ4401 塊的計數

description 小y最近從同學那裡聽說了乙個十分牛b的高階資料結構 塊狀樹。聽說這種資料結構能在sqrt n 的時間內維護樹上的各種資訊,十分的高效。當然,無聊的小y對這種事情毫無興趣,只是對把樹分塊這個操作感到十分好奇。他想,假如能把一棵樹分成幾塊,使得每個塊中的點數都相同該有多優美啊!小...

bzoj 4401 塊的計數

根據塊狀樹的那堆理論可以發現,對於某種塊大小,可行的分法只有一種 如果乙個點能被當成塊頂,僅當其子樹大小是塊大小的倍數 於是列舉塊的大小 i 當可行的塊頂個數大於等於 n i 時,就可以構造出可行的分法了 時間複雜度 o sum d include define n 2010000 using na...

BZOJ4401 塊的計數

小y最近從同學那裡聽說了乙個十分牛b的高階資料結構 塊狀樹。聽說這種資料結構能在sqrt n 的時間內維護樹上的各種資訊,十分的高效。當然,無聊的小y對這種事情毫無興趣,只是對把樹分塊這個操作感到十分好奇。他想,假如能把一棵樹分成幾塊,使得每個塊中的點數都相同該有多優美啊!小y很想知道,能有幾種分割...