分析:

  假设在第一个树上我们有一个长度为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. Python基础:字符串(string)

    字符串的常用操作 字符串与数组一样,支持索引操作.切片与遍历 索引.切片操作: name = 'jason' name[0] 'j' name[1:3] 'as' 遍历: for char in na ...

  2. 在SCIKIT中做PCA 逆变换 -- 新旧特征转换

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  3. Windows7_64位 NVIDIA 卡 OpenCl环境配置

    序 最近做一个项目需要用到OpenCL,由于之前没有接触过,所以在环境配置第一关就遇到了一些问题,查阅很多资料才配置完成,现在记录如下,希望给一些童鞋一些帮助. 整个步骤也很简单: 了解系统配置,选择 ...

  4. 二叉排序树:POJ2418-Hardwood Species(外加字符串处理)

    Hardwood Species Time Limit: 10000MS Memory Limit: 65536K Description Hardwoods are the botanical gr ...

  5. 【转】git bash here 右键菜单失效后的修复方法

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\git_shell] @="Git Ba&sh Here"   [ ...

  6. HDU4010 Query on The Trees (LCT动态树)

    Query on The Trees Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Othe ...

  7. Selenium WebDriver-通过键盘事件操作浏览器

    #encoding=utf-8 import unittest import time import chardet from selenium import webdriver class Visi ...

  8. SCOI 2010 滑雪

    题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着 MM 条供滑行的轨道和 NN 个轨道之间的交点(同时也是景点),而且每个景点都有一编号 ii ( 1 \le i \le N1≤i≤N ...

  9. TOJ4505: KOSARE

    TOJ4505: KOSARE  Time Limit(Common/Java):10000MS/30000MS     Memory Limit:65536KByteTotal Submit: 11 ...

  10. acmer之ubuntu下安装Eclipse

    ubuntu是acmer常用的系统,配置起CB还是比较简单的三行命令就OK了 //Current stable version of Code::Blocks IDE (16.01) //To ins ...