← Home
package main

import (
	"bufio"
	"fmt"
	"math/big"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	if n == 1 {
		fmt.Println(1)
		return
	}

	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		scanner.Scan()
		u, _ := strconv.Atoi(scanner.Text())
		scanner.Scan()
		v, _ := strconv.Atoi(scanner.Text())
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	sz := make([]int, n+1)
	dp := make([][]*big.Int, n+1)

	var dfs func(int, int)
	dfs = func(u, p int) {
		sz[u] = 1
		dp[u] = make([]*big.Int, 2)
		dp[u][1] = big.NewInt(1)

		for _, v := range adj[u] {
			if v == p {
				continue
			}
			dfs(v, u)

			newSz := sz[u] + sz[v]
			newDp := make([]*big.Int, newSz+1)

			for s := 1; s <= sz[u]; s++ {
				if dp[u][s] == nil {
					continue
				}
				for t := 1; t <= sz[v]; t++ {
					if dp[v][t] == nil {
						continue
					}

					prod1 := new(big.Int).Mul(dp[u][s], dp[v][t])
					if newDp[s+t] == nil || newDp[s+t].Cmp(prod1) < 0 {
						newDp[s+t] = prod1
					}

					prod2 := new(big.Int).Mul(prod1, big.NewInt(int64(t)))
					if newDp[s] == nil || newDp[s].Cmp(prod2) < 0 {
						newDp[s] = prod2
					}
				}
			}
			dp[u] = newDp
			sz[u] = newSz
			dp[v] = nil
		}
	}

	dfs(1, 0)

	ans := big.NewInt(0)
	for s := 1; s <= sz[1]; s++ {
		if dp[1][s] != nil {
			cand := new(big.Int).Mul(dp[1][s], big.NewInt(int64(s)))
			if ans.Cmp(cand) < 0 {
				ans = cand
			}
		}
	}

	fmt.Println(ans.String())
}