分析:

  假设在第一个树上我们有一个长度为x的环,在第二树上我们有一个长度为y的环,那么可以在叉积树上构造出$\binom{x+y}{x}$个长度为x+y的环

  问题的关键就变成了如何统计出在一个树上的长度为i的环的个数

  设$f(u,v,k)$表示从u点出发走k步回到u点,中途不经过点v的方案数,其中v是u的相邻点

  考虑求解的转移过程,一定是从u走到某个邻接点w(w!=v),然后从w走到w(不经过u),然后再回到u,于是有转移方程

  

  这个是$O(n^2k^2)$的,但明显里面的w不需要枚举,只需要拿sum减去w=v的情况就行了,于是变成了$O(nk^2)$

 #include<bits/stdc++.h>
using namespace std;
#define mp make_pair
const int maxn=,mod=;
int k;
int ans;
int C[][];
void inc(int &a,int b)
{
a=(a+b)%mod;
}
struct wjmzbmr
{
int n;
vector<int> g[maxn+];
vector<int> dp[][maxn+];
int sum[][maxn+];
int ans[maxn+],sz[maxn+];
map<pair<int,int>,int> s;
void init()
{
for(int i=;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v),g[v].push_back(u);
}
for(int i=;i<=n;++i)
for(int j=;j<g[i].size();++j)
s[mp(i,g[i][j])]=j;
for(int i=;i<=n;++i) sz[i]=g[i].size(),g[i].push_back();
for(int t=;t<=k;++t)
for(int i=;i<=n;++i)
dp[t][i].resize(sz[i]+,);
}
void work()
{
for(int i=;i<=n;++i)
for(int j=;j<=sz[i];++j)
{ dp[][i][j]=;
inc(sum[][g[i][j]],);
}
for(int i=;i<=k;++i)
for(int u=;u<=n;++u)
for(int j=;j<=sz[u];++j)
{
int v;
if(j<sz[u]) v=g[u][j];else v=;
int id;
if(v==) id=;
else
id=s[mp(v,u)];
for(int t=;t<=i-;++t)
dp[i][u][j]=((dp[i][u][j]+1LL*dp[i-t-][u][j]*(sum[t][u]-dp[t][v][id])%mod)%mod+mod)%mod;
inc(sum[i][v],dp[i][u][j]);
}
for(int i=;i<=k;i+=)
for(int u=;u<=n;++u)
inc(ans[i],dp[i][u][sz[u]]);
}
}tree[];
int main()
{
//freopen("ce.in","r",stdin);
scanf("%d%d%d",&tree[].n,&tree[].n,&k);
tree[].init(),tree[].init();
tree[].work();
tree[].work();
C[][]=;
for(int i=;i<=k;++i)
{
C[i][]=;
for(int j=;j<=i;++j)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
}
for(int i=;i<=k;++i)
inc(ans,int(1LL*tree[].ans[i]*tree[].ans[k-i]%mod*C[k][i]%mod));
printf("%d\n",ans);
return ;
}

最新文章

  1. [LeetCode] Search for a Range 搜索一个范围
  2. 苹果系统安装虚拟机 Mac如何安装虚拟机教程
  3. JavaScript学习笔记——DOM_对document对象的内容、属性、样式的操作
  4. Amoeba基本配置
  5. C#缓存的一点想法及测试
  6. addEventListener之handleEvent
  7. struct2(四)编写Struct2 的Action
  8. C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
  9. BCDedit 研究
  10. 拖动条(SeekBar)的功能和用法
  11. Android之AppWidget 开发浅析
  12. 开源的.NET定时任务组件Hangfire解析
  13. centos下彻底删除mysql的方法
  14. WEB-INF 目录
  15. HDU 4347 - The Closest M Points - [KDTree模板题]
  16. directive例子2
  17. (转载)利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 置顶
  18. javascript本地,宿主,内置对象
  19. Nginx Tengine ngx_http_upstream_check_module 健康功能检测使用
  20. Android Intent 总结

热门文章

  1. manjaro(arch)里的vbox 安装centos7后,centos无法联网的解决办法
  2. re--参考手册
  3. PHP如何利用sleep实现 输出-&gt;等待-&gt;输出
  4. JAVA-基础(六) Java.serialization 序列化
  5. 遍历Request.QueryString
  6. python--命名规范及常见的数据类型
  7. 运行Android程序出错:The connection to adb is down, and a severe error has occured
  8. AtCoder Beginner Contest 070
  9. 九度oj 题目1470:调整方阵
  10. 实现chrome多用户独立cookie