社区讨论

55分萌新求助

P1411参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi6yursj
此快照首次捕获于
2025/11/20 13:03
4 个月前
此快照最后确认于
2025/11/20 13:03
4 个月前
查看原帖
RT
此题不压位可做吗orz
CPP
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=702,M=65;
struct E
{
	int to,nxt;
}edge[N<<1];
struct node
{
    int a[M];
    inline node(){memset(a,0,sizeof(a)); a[0]=1;}
    inline node(int x)
    {
        memset(a,0,sizeof(a));
        while (x){a[++a[0]]=x%10; x/=10;}
    }
    inline node operator * (const node &b)
    {
        node ret; int g=0;
        for (int i=1;i<=a[0];i++)
        {
            g=0;
            for (int j=1;j<=b.a[0];j++)
            {
                ret.a[i+j-1]+=a[i]*b.a[j]+g;
                g=ret.a[i+j-1]/10;
                ret.a[i+j-1]%=10;
            }
            ret.a[i+b.a[0]]=g;
        }
        int len=a[0]+b.a[0];
        while (!ret.a[len]&&len>1) --len;
        ret.a[0]=len; return ret;
    }
    inline void print(){for (int i=a[0];i;i--) printf("%d",a[i]);}
    inline friend bool operator > (node x,node y)
    {
        if (x.a[0]>y.a[0]) return true;
        if (x.a[0]<y.a[0]) return false;
        for (int i=x.a[0];i;i--)
        {
            if (x.a[i]>y.a[i]) return true;
            if (x.a[i]<y.a[i]) return false;
        }
        return false;
    }
}f[N][N];
int n,num,head[N],tot[N];
inline void add_edge(int from,int to)
{
	edge[++num]=(E){to,head[from]};
	head[from]=num;
}
void dfs(int k,int fa)
{
	tot[k]=1; f[k][0]=f[k][1]=1;
	for (int i=head[k];i;i=edge[i].nxt)
	{
		int v=edge[i].to;
		if (v==fa) continue; 
		dfs(v,k); tot[k]+=tot[v];
		for (int j=tot[k];j;j--)
		  for (int t=min(j,tot[k]-tot[v]);t>=max(j-tot[v],1);--t)
		  {
		  	  node tmp=f[k][t]*f[v][j-t];
		  	  if (tmp>f[k][j]) f[k][j]=tmp;
		  }
	}
	for (int i=1;i<=tot[k];i++)
	{
		node tmp=i; tmp=tmp*f[k][i];
		if (tmp>f[k][0]) f[k][0]=tmp;
	}
}
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);
	}
	dfs(1,0);
	f[1][0].print();
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...