Jzoj4757 樹上摩托

2022-05-09 15:20:53 字數 1110 閱讀 3753

sherco是一位經驗豐富的魔♂法師。

sherco在第零次聖杯戰爭中取得了勝利,並取得了王之寶藏——王の樹。

他想把這棵樹砍去任意條邊,拆成若干棵新樹,並裝飾在他的摩托上,讓他的摩托更加酷炫。

但sherco認為,這樣生成的樹不具有美感,於是sherco想讓每棵新樹的節點數相同。

他想知道有多少種方法分割這棵樹。

首先乙個很顯然的結論是,每塊的大小一定是n的約數,對於一種塊的大小,顯然分法是唯一的

證明?口胡一下就是乙個子樹如果正好大小為k且根的父親邊沒被斷掉就肯定得不到答案

好了我們考慮列舉每乙個約數讓後dfs一次?

超時了!n<=10^6

我們考慮一下將原樹看做乙個有根樹,乙個節點可以作乙個塊的」根」,當且僅當該節點的 size 能被塊的大小整除 預處理出每個節點的 size,列舉樹的大小 k,判斷 size 為 k 的倍數的節點數量是否為n/k就好了

複雜度nlgn,注意要打bfs

#pragma gcc opitmize("o3")

#pragma g++ opitmize("o3")

#include

#include

#include

#include

using

namespace

std;

struct edgeg[2000010]; queue

q;int sz[1000010],h[1000010],n,cnt=0,a=0,c[1000010],f[1000010];

inline

void adj(int x,int y); h[x]=cnt;

g[++cnt]=(edge); h[y]=cnt;

}void bfs()

for(;a;--a) sz[f[c[a]]]+=sz[c[a]];

}int main()

bfs(); memset(c,0,sizeof c);

for(int i=1;i<=n;++i) ++c[sz[i]];

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

if(n%i==0)

printf("%d\n",a);

}

jzoj4757 樹上摩托

把這棵樹砍去任意條邊,拆成若干棵新樹,讓每棵新樹的節點數相同。有多少種方法分割這棵樹。首先可以變成有根樹,列舉每棵樹的節點數k,則size為k的倍數的個數有等於n k。我們可以開乙個桶存size,列舉size統計個數判斷即可。include include include include inclu...

JZOJ5055 樹上路徑

給定一棵 n 個節點的無根樹,每個點都有乙個非負整數的權值va li,定義一條路徑的價值為路徑上的點權和減去路徑的點權最大值。給定引數 p 請求出樹上有多少條價值是 p的倍數的路徑。注意 單點也算路徑。並且路徑 u v 和 v u 只算一次。1 n 105 1 p 107,0 va li 10 9 ...

樹上摩托 NOIP2016提高A組模擬9 4

sherco是一位經驗豐富的魔 法師。sherco在第零次聖杯戰爭中取得了勝利,並取得了王之寶藏 王 樹。他想把這棵樹砍去任意條邊,拆成若干棵新樹,並裝飾在他的摩托上,讓他的摩托更加酷炫。但sherco認為,這樣生成的樹不具有美感,於是sherco想讓每棵新樹的節點數相同。他想知道有多少種方法分割這...