今天考試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...