分析:

  假设在第一个树上我们有一个长度为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 ;
}

CF997D的更多相关文章

  1. 997D Cycles in product

    传送门 题目大意 https://www.luogu.org/problemnew/show/CF997D 分析 我们发现两棵树互不相关 于是我们可以分别求出两棵树的信息 我们点分,人啊按后设f[i] ...

随机推荐

  1. java/jsp执行sql语句的方式

    首先给出sql驱动包 引入sql包 import java.sql.*;//java <%@ page import="java.sql.*"%>//jsp 连接mys ...

  2. leetcode-26-exercise_linked-list

    141. Linked List Cycle Given a linked list, determine if it has a cycle in it. 解题思路: 需要检查before和afte ...

  3. graph-SCC

    strongly connected component(SCC): 里面的任一对顶点都是互相可达的. 一个有向图,将每个SCC缩成一个点,那么这个图就变成了DAG(有向无环图). 原图进行DFS之后 ...

  4. HDU 4965 Fast Matrix Calculation 矩阵快速幂

    题意: 给出一个\(n \times k\)的矩阵\(A\)和一个\(k \times n\)的矩阵\(B\),其中\(4 \leq N \leq 1000, \, 2 \leq K \leq 6\) ...

  5. HDU 3639 SCC Hawk-and-Chicken

    求SCC缩点,统计出每个SCC中的点的个数. 然后统计能到达u的最多的点的个数,可以反向建图,再dfs一遍统计出来. 最后说一下,有必要开一个标记数组,因为测试数据中有重边,结果无限WA. #incl ...

  6. Python并发(一)

    假设我们要从一个网站用Python程序下载5张图片,最传统的思路就是写个for循环挨个挨个下载,但是这样做有个缺点,就是除了第一张,每张图片都必须等待前一张图片下载完毕后,才可以开始下载.由于网络有很 ...

  7. luogu3390 【模板】矩阵快速幂

    #include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll k; c ...

  8. python - 读取配置文件

    # -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: read_config.py @ide: PyCharm Commun ...

  9. python学习-- django 2.1.7 ajax 请求

    #--------------views.py---------------------- def add(request): a = request.GET['a'] print(a) b = re ...

  10. AutoEncoder and DenoiseAutoEncoder

    AutoEncoder and DenoiseAutoEncoder 第一部分 首先我们将实现一个如上图结构的最简单的AutoEncoder. 加载数据 在这里,我们使用MNIST手写数据集来进行实验 ...