分析:

  假设在第一个树上我们有一个长度为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. 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome Problem Description A string is palindrome if it can be read the same way in either di ...

  2. 二叉排序树:HDU3791-二叉搜索树(用指针建立二叉排序树)

    二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...

  3. linux下文件显示被加锁如何解决?

    1.很多时候从别的机器上拷贝过来的文件,没有权限打开,上面有一个小锁. 2.判断是权限没有,查询ls -al得知文件的的所有者,和所有者在的组都不是本机 3.使用chown改变用户的所有者和所有者所在 ...

  4. [密钥权限过大错误]ssh “permissions are too open” error

    I had a problem with my mac where I couldn't save any kind of file on the disk anymore. I had to reb ...

  5. HLG2179 组合(dfs水水更健康)

    组合 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 57(38 users) Total Accepted: 43(36 users) ...

  6. 【Luogu】P1110报表统计(Splay)

    题目链接 SBT,我居然没看出来. 就是插入的时候考虑向平衡树里插两个差值,删一个差值. 另一个操作就是维护某元素和其前驱后继的差值最小值就行了. 然后Splay超时了…… (貌似Splay超时了之后 ...

  7. bzoj 1572: [Usaco2009 Open]工作安排Job

    Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...

  8. element-ui 的input组件 @keyup.enter事件的添加办法

    <el-input placeholder="请输入密码" type="password" @keyup.enter.native="login ...

  9. 主机ping不通虚拟机,但是虚拟机能ping通主机

    一.虚拟机网络连接方式选择Nat 二. 关闭Linux防火墙命令:service iptables stop / service firewalld stop 查看Linux防火墙状态命令:servi ...

  10. bzoj 2803 [POI2012]prefixuffix hsh+性质

    题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满 ...