| #include<bits/stdc++.h> |
| using namespace std; |
| typedef long long ll; |
| struct Wint:vector<ll> { |
| const static ll BIT=1e8; |
| Wint(ll n=0) { |
| push_back(n); |
| check(); |
| } |
| Wint& operator=(const char* num) { |
| int Len=strlen(num)-1; |
| clear(); |
| for(int i=Len; i>=0; i-=9) { |
| push_back(0); |
| ll w=1; |
| for(int j=i; j>i-9&&j>=0; --j) |
| back()+=(num[j]^48)*w,w*=10; |
| } |
| return *this; |
| } |
| Wint& check() { |
| while(!empty()&&!back()) pop_back(); |
| if(empty()) return *this; |
| for(int i=1; i<size(); ++i) |
| (*this)[i]+=(*this)[i-1]/BIT, |
| (*this)[i-1]%=BIT; |
| while(back()>=BIT) { |
| push_back(back()/BIT); |
| (*this)[size()-2]%=BIT; |
| } |
| return *this; |
| } |
| }f[705][705],ans=1; |
| bool operator<(Wint a,Wint b) { |
| if(a.size()!=b.size()) return a.size()<b.size(); |
| for(int i=a.size()-1; i>=0; --i) |
| if(a[i]!=b[i]) return a[i]<b[i]; |
| return 0; |
| } |
| bool operator>(Wint a,Wint b) { |
| return b<a; |
| } |
| bool operator<=(Wint a,Wint b) { |
| return !(a>b); |
| } |
| bool operator>=(Wint a,Wint b) { |
| return !(a<b); |
| } |
| bool operator!=(Wint a,Wint b) { |
| return a<b||b<a; |
| } |
| bool operator==(Wint a,Wint b) { |
| return !(a<b)&&!(b<a); |
| } |
| Wint& operator+=(Wint &a,Wint b) { |
| if(a.size()<b.size()) a.resize(b.size()); |
| for(int i=0; i<b.size(); ++i) a[i]+=b[i]; |
| return a.check(); |
| } |
| Wint operator+(Wint a,Wint b) { |
| return a+=b; |
| } |
| Wint& operator-=(Wint &a,Wint b) { |
| for(int i=0; i<b.size(); a[i]-=b[i],++i) |
| if(a[i]<b[i]) { |
| int j=i+1; |
| while(!a[j]) ++j; |
| while(j>i) --a[j],a[--j]+=Wint::BIT; |
| } |
| return a.check(); |
| } |
| Wint operator-(Wint a,Wint b) { |
| return a-=b; |
| } |
| Wint operator*(Wint a,Wint b) { |
| Wint n; |
| n.assign(a.size()+b.size()-1,0); |
| for(int i=0; i<a.size(); ++i) |
| for(int j=0; j<b.size(); ++j) |
| n[i+j]+=a[i]*b[j]; |
| return n.check(); |
| } |
| Wint& operator*=(Wint &a,Wint b) { |
| return a=a*b; |
| } |
| Wint operator/(Wint a,int b) { |
| Wint n; |
| bool wp=0; |
| ll t=0; |
| for(int i=a.size()-1; i>=0; --i) { |
| t=t*Wint::BIT+a[i]; |
| if(wp||t/b) wp=1,n.push_back(t/b); |
| t%=b; |
| } |
| reverse(n.begin(),n.end()); |
| return n; |
| } |
| Wint& operator/=(Wint &a,int b) { |
| return a=a/b; |
| } |
| void writeX(Wint n) { |
| if(n.empty()) return putchar('0'),void(); |
| int Len=n.size()-1; |
| printf("%lld",n[Len]); |
| for(int i=Len-1; i>=0; --i) printf("%08lld",n[i]); |
| } |
| int n,cnt,h[705],size[705]; |
| struct Edge{ |
| int to,next; |
| }e[1405]; |
| void Add_Edge(int x,int y){ |
| e[++cnt]={y,h[x]},h[x]=cnt; |
| } |
| void DP(int x,int fa){ |
| f[x][0]=1; |
| for(int i=h[x];i;i=e[i].next){ |
| int y=e[i].to; |
| if(y==fa)continue; |
| DP(y,x),size[x]+=size[y]; |
| Wint t=1,t2; |
| for(int k=size[y];k>0;k--)t=max(t,f[y][k]*k); |
| for(int j=size[x];j>=0;j--){ |
| t2=t*f[x][j]; |
| for(int k=min(j,size[y]);k>0&&j-k<=size[x]-size[y];k--)f[x][j]=max(f[x][j],f[x][j-k]*f[y][k]); |
| f[x][j]=max(f[x][j],t2); |
| } |
| } |
| for(int i=n;i>=1;i--)f[x][i]=f[x][i-1],ans=max(ans,f[x][i]*i); |
| size[x]++; |
| } |
| int main(){ |
| scanf("%d",&n); |
| for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),Add_Edge(x,y),Add_Edge(y,x); |
| DP(1,0),writeX(ans); |
| return 0; |
| } |
【推荐】中国电信天翼云云端翼购节,2核2G云服务器一口价38元/年
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在.NET Core中使用异步多线程高效率的处理大量数据
· 聊一聊 C#前台线程 如何阻塞程序退出
· 几种数据库优化技巧
· 聊一聊坑人的 C# MySql.Data SDK
· 使用 .NET Core 实现一个自定义日志记录器
· 字节豆包,来园广告
· 为什么推荐在 .NET 中使用 YAML 配置文件
· 在 .NET Core 中使用 Channel 实现生产者消费者模式
· C#字符串拼接的几种方式及其性能分析对比
· 干掉EasyExcel!FastExcel初体验