1 条题解
-
0

#include<bits/stdc++.h> using namespace std; int n,m,mod; vector<int>t1[3005]; vector<int>t2[3005]; int dp[3005][3005][3]; long long ans; int getid(int u,int v) { int dk=0; for(int x:t1[u]) { if(v==x) { return dk; } dk++; } return -1; } void dfs(int u,int fa) { int son1=0,son2=0,cnt=0; for(int v:t2[u]) { if(v==fa) { continue; } dfs(v,u); if(!cnt) { son1=v; cnt=1; } else { son2=v; cnt++; } } for(int x=1;x<=n;x++) { for(int i=0;i<(int)t1[x].size();i++) { int a=0,b=0,tot=0; for(int y:t1[x]) { if(y==t1[x][i]) { continue; } if(tot==0) { a=y; } else { b=y; } tot++; } if(tot==0) { dp[u][x][i]=1%mod; } else if(tot==1) { int ia=getid(a,x); if(cnt>=1) { dp[u][x][i]+=dp[son1][a][ia]; } if(cnt>=2) { dp[u][x][i]+=dp[son2][a][ia]; } dp[u][x][i]%=mod; } else { if(cnt<2) { dp[u][x][i]=0; } else { int ia=getid(a,x); int ib=getid(b,x); dp[u][x][i]+=(long long)dp[son1][a][ia]*dp[son2][b][ib]%mod; dp[u][x][i]+=(long long)dp[son2][a][ia]*dp[son1][b][ib]%mod; dp[u][x][i]%=mod; } } } } // 枚举x映射到u,并且u是整个映射中最高点的方案数 for(int x=1;x<=n;x++) { int d=t1[x].size(); if(d==0) { ans+=1%mod; } else if(d==1) { int a=t1[x][0]; int ia=getid(a,x); if(cnt>=1) { ans+=dp[son1][a][ia]; } if(cnt>=2) { ans+=dp[son2][a][ia]; } ans%=mod; } else if(d==2&&cnt==2) { int a=t1[x][0]; int b=t1[x][1]; int ia=getid(a,x); int ib=getid(b,x); ans+=(long long)dp[son1][a][ia]*dp[son2][b][ib]%mod; ans+=(long long)dp[son2][a][ia]*dp[son1][b][ib]%mod; ans%=mod; } } } int main() { scanf("%d%d%d",&n,&m,&mod); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); t1[u].push_back(v); t1[v].push_back(u); } for(int i=1;i<m;i++) { int u,v; scanf("%d%d",&u,&v); t2[u].push_back(v); t2[v].push_back(u); } int rt=1; while(rt<=m&&(int)t2[rt].size()>1) { rt++; } dfs(rt,0); printf("%lld",ans%mod); }
- 1
信息
- ID
- 3373
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者