題解 count(樹上切割)

2022-02-19 19:49:10 字數 1101 閱讀 1366

今天考試t1,和我之前寫的一篇叫做士多啤梨的題解有點像

description

求一共有多少種方案可以把一棵樹分成大小相同的幾塊。

input

第一行乙個數n,表示數的大小。

第二行至第n行,每行兩個數x,y表示x和y之間有一條邊。

output

一行,表示方案數。

sample input

61 2

2 32 4

4 55 6

sample output

3

我們考慮,如果數 ai 能夠滿足將一棵樹切割為若干大小相同的塊,那麼首先 ai 必須是 n 的因數。(在1e6的資料內,最大的因數個數是乙個較小的3位數)。然後,像士多啤梨那道題一樣,列舉每個因數,只要存在能將乙個子樹大小剛為因數的,我們就將這個子樹減去。如果子樹大小超了,那麼肯定無法減去。

題解傳送門:題解——士多啤梨`

ac code: 我寫的相當簡潔

#includeusing namespace std;

const int maxn = 1000005 ;

inline int read()

int n , size[ maxn ] , head[ maxn ] ,to[ maxn*2 ] , nex[ maxn*2 ] , ans = 0 , tot = 1 ;

bool key ;

void add( int x , int y )

void dfs( int u , int fa , int val )

if( size[ u ] == val )size[ u ] = 0 ;

if( size[ u ] > val )

}int main()

ans = 1 ; // 1

for( register int i = 2 ; i <= n ; ++i )

if( !( n%i ) )

} cout

}}

題解 士多啤梨(樹上切割)

自述 判斷放進了迴圈,debug了1.5個小時,最後還是請sxk大佬才改出,感謝sxk大佬院子裡有一顆又高又大的士多啤梨樹,士多啤梨樹有n個節點,每個節點都結了乙個士多啤梨,吃掉第i個結點的士多啤梨可以得到ai的營養值,由於士多啤梨可能會壞掉,所以ai可能為負值,也可能為0。現在要砍掉這顆樹的兩條邊...

樹上染色題解

有一棵點數為n的樹,樹邊有邊權。將m個點染成黑色,並將其他的點染成白色。會獲得黑點兩兩之間的距離和加上白點兩兩之間的距離和的收益。問收益最大值是多少。輸入格式 第一行兩個整數n m。接下來n 1行,每行三個整數a b c,表示有一條樹邊連線a b,長度為c。輸出格式 一行 乙個正整數,表示收益的最大...

題解 樹上路徑

一棵樹的構造過程為 首先以1號點為根,然後依次加入2 n號點。加入i號點時,在1 i 1點中選擇乙個點為f i 將i號點與其相連線。yuri想要求出,每次加點之後路上的最長路徑長度。第一行乙個整數n,表示樹的節點個數。第二行n 1個整數,第i個整數表示f i 1 一行n 1個整數,分別表示加完2 n...