1 条题解
-
0
luogu
#include"cstdio" #include"cstring" #include"iostream" #include"algorithm" using namespace std; const int MAXN=1005; const int MOD=1e9; int n,np,maxn,root; int fa[MAXN],h[MAXN]; int f[3][MAXN]; struct rpg{ int li,nx; }a[MAXN]; struct Big{ long long v[25]; void reset(){memset(v,0,sizeof(v));v[0]=1;} void write(){printf("%lld",v[v[0]]);for(int i=v[0]-1;i;--i) printf("%09lld",v[i]);puts("");} void pls(Big a,Big b){ reset(); v[0]=max(a.v[0],b.v[0])+1; for(int i=1;i<=v[0];++i){ v[i]+=a.v[i]+b.v[i]; if(v[i]>=MOD) v[i]-=MOD,++v[i+1]; }if(!v[v[0]]&&v[0]>1) --v[0]; return; } void mul(Big a,Big b){ reset(); v[0]=a.v[0]+b.v[0]; for(int i=1;i<=a.v[0];++i){ for(int j=1;j<=b.v[0];++j){ v[i+j-1]+=a.v[i]*b.v[j]; if(v[i+j-1]>=MOD) v[i+j]+=v[i+j-1]/MOD,v[i+j-1]%=MOD; } }while(!v[v[0]]&&v[0]>1) --v[0]; return; } }cnt[3][MAXN],ans; void add(int ls,int nx){a[++np]=(rpg){h[ls],nx};h[ls]=np;} void dfs(int x) { f[1][x]=(bool)fa[x]; for(int i=0;i<3;++i) cnt[i][x].reset(); cnt[1][x].v[1]=cnt[2][x].v[1]=1; if(h[x]) cnt[0][x].v[1]=1; Big cl,ct;cl.reset();cl.v[1]=1; for(int i=h[x];i;i=a[i].li){ dfs(a[i].nx); if(f[0][a[i].nx]==f[2][a[i].nx]) ct.pls(cnt[0][a[i].nx],cnt[2][a[i].nx]),cl.mul(cl,ct); if(f[0][a[i].nx]>f[2][a[i].nx]) cl.mul(cl,cnt[0][a[i].nx]); if(f[0][a[i].nx]<f[2][a[i].nx]) cl.mul(cl,cnt[2][a[i].nx]); f[1][x]+=max(f[0][a[i].nx],f[2][a[i].nx]); f[2][x]+=max(f[0][a[i].nx],f[2][a[i].nx]); }cnt[1][x]=cnt[2][x]=cl; for(int i=h[x];i;i=a[i].li){ int mx=f[1][a[i].nx]; Big clc=cnt[1][a[i].nx]; for(int j=h[x];j;j=a[j].li){ if(a[j].nx==a[i].nx) continue; if(f[0][a[j].nx]==f[2][a[j].nx]) ct.pls(cnt[0][a[j].nx],cnt[2][a[j].nx]),clc.mul(clc,ct); if(f[0][a[j].nx]>f[2][a[j].nx]) clc.mul(clc,cnt[0][a[j].nx]); if(f[0][a[j].nx]<f[2][a[j].nx]) clc.mul(clc,cnt[2][a[j].nx]); mx+=max(f[0][a[j].nx],f[2][a[j].nx]); }if(f[0][x]<mx) f[0][x]=mx,cnt[0][x]=clc; else if(f[0][x]==mx) cnt[0][x].pls(cnt[0][x],clc); }return; } int main() { scanf("%d",&n); for(int i=1;i<=n;++i){ int x,m;scanf("%d%d",&x,&m); while(m--){int y;scanf("%d",&y);fa[y]=x;add(x,y);} }for(int i=1;i<=n;++i) if(!fa[i]) root=i; dfs(root);maxn=max(f[0][root],f[2][root]); if(f[0][root]>f[2][root]) ans=cnt[0][root]; if(f[0][root]==f[2][root]) ans.pls(cnt[0][root],cnt[2][root]); if(f[0][root]<f[2][root]) ans=cnt[2][root]; printf("%d\n",maxn);ans.write(); return 0;///test }
- 1
信息
- ID
- 618
- 时间
- 500ms
- 内存
- 32MiB
- 难度
- 6
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者