CF997D
分析:
假设在第一个树上我们有一个长度为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的更多相关文章
- 997D Cycles in product
传送门 题目大意 https://www.luogu.org/problemnew/show/CF997D 分析 我们发现两棵树互不相关 于是我们可以分别求出两棵树的信息 我们点分,人啊按后设f[i] ...
随机推荐
- Struts2和Spring MVC 区别 今天面试被问到了
虽然说没有系统的学习过Spring MVC框架, 但是工作这么长时间, 基本上在WEB层使用的都是Spring MVC, 自己觉得Struts2也是一个不错的WEB层框架, 这两种框架至今自己还未有比 ...
- python基础学习笔记——类空间问题以及类之间的关系
一. 类的空间问题 1.1 何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): self ...
- 用HashMap优化斐波那契数列 java算法
斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times ...
- Go语言学习03
Go语言-数组类型 一个数组(Array)就是一个可以容纳若干类型相同的元素的容器.这个容器的大小(即数组的长度)是固定的,且是体现在数组的类型字面量之中的.比如,我们声明了一个数组类型: type ...
- 剑指offer算法编程题目部分汇总(解法略)
总结一下本书中遇到的大部分面试题.面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个整数,判断数 ...
- python-高级编程-03
[多进程与多线程] 调度 : 在传统计算机操作系统中 cpu的调度的基本单位是进程,随着线程的引入,线程变成操作系统的最小调度单位 而进程是作为资源的拥有单位. 并行:由于线程的引入 原先一个进程只能 ...
- MongoDB 3.6 安装详解
在ubuntu和多数linux发行版的包安装源中MongoDB默认的版本是2.4,但2.4所使用的存储引擎不支持collecitons级别的锁,只支持database级别的,所以在开发中2.4版本的m ...
- 我们为什么要研究docker
一.docker整体概述 Docker会是改变世界的那只"箱子"吗? 是什么:世界领先的软件容器平台: 开发者使用docker可以解决"在我的机器上没问题" ...
- 模拟select框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 用meta标签让网页用360打开时默认为极速模式
最近做项目,用360浏览器访问自己的本地网页,发现都是默认在兼容模式下打开,做的淡入淡出轮播效果在兼容模式下看时,感觉切换很生硬.百度,发现360官网帮助里有说明用meta标签控制浏览器内核,网址为h ...