• 高精度模板02


    #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;
    }
  • 相关阅读:
    sqlserver 批量删除所有表语句
    C# 中的委托和事件
    Oracle建立用户
    C# Linq获取两个List或数组的差集交集
    Linux下Redis安装与配置操作说明
    word缩印
    centos7上的postgresql10安装和配置
    numpy技巧
    发票二维码扫描增强_06_持续优化
    发票二维码扫描增强_05_构建目标二维码
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/15374848.html
Copyright © 2020-2023  润新知