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想讓每棵新樹的節點數相同。他想知道有多少種方法分割這...