题目链接  Path Counting

题意  给定一棵高度为$n$的树,给出每一层的每个点的儿子个数(某一层的所有点儿子个数相同)。

    令$f_{k}$为长度为$k$的路径条数,求$f_{1}, f_{2}, ..., f_{2n-2}$。

考虑DP,设$f[i][j]$为从深度为$i$的点出发背对以$i$为根的子树(即任何时候都不进入以$i$为根的子树)走$j$步之后可以到达的点的个数。

(同一条边最多走一次)

那么$f[i][j] = f[i-1][j-1] + calc(i-1, j-1)$, $calc(i, j)$为从$i$点出发往以$i$为根的子树走$j$步能到达的点的个数。

然后这一层对答案的贡献即为$f[i][j] * g[i]$($g[i]$为第$i$层结点个数)

我们会发现这样那些一个点为另一个点的祖先的路径只统计了一次,其他路径统计了两次。

为了一致我们再求一遍前者类型路径的个数,加起来除以$2$即可。

时间复杂度$O(n^{2})$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 5e3 + 10;
const int mod = 1e9 + 7;
const int rev = 5e8 + 4; int a[N << 1], f[N][N << 1];
int num[N << 1], c[N << 2], s[N << 1], inv[N << 1];
int ans[N << 1];
int n; inline int Pow(int a, int b, int mod){
int ret = 1;
for (; b; b >>= 1, a = 1ll * a * a % mod) if (b & 1) ret = 1ll * ret * a % mod;
return ret;
} int calc(int x, int y){
int ret = (a[x] + mod - 1) % mod;
ret = 1ll * ret * c[x + y - 1] % mod;
ret = 1ll * ret * inv[x] % mod;
return ret;
} int main(){ scanf("%d", &n);
rep(i, 1, n - 1) scanf("%d", a + i); num[1] = 1;
rep(i, 2, n) num[i] = 1ll * num[i - 1] * a[i - 1] % mod; c[0] = 1;
rep(i, 1, n) c[i] = 1ll * c[i - 1] * a[i] % mod; rep(i, 1, n) inv[i] = Pow(c[i], mod - 2, mod); s[0] = 0;
rep(i, 1, n) s[i] = (s[i - 1] + num[i]) % mod; rep(i, 2, n){
f[i][1] = 1;
rep(j, 2, 2 * n - 2){
f[i][j] = (1ll * f[i - 1][j - 1] + calc(i - 1, j - 1)) % mod;
}
} rep(i, 1, 2 * n - 2){
rep(j, 1, n){
ans[i] = (1ll * ans[i] + 1ll * f[j][i] * num[j]) % mod;
}
} rep(i, 1, n - 1){
ans[i] = (ans[i] + s[n]) % mod;
ans[i] = (ans[i] - s[i] + mod) % mod;
} rep(i, 1, 2 * n - 2) ans[i] = 1ll * ans[i] * rev % mod;
rep(i, 1, 2 * n - 2) printf("%d\n", ans[i]);
return 0;
}

最新文章

  1. hdu1532网络流
  2. Source Insight常用功能设置
  3. ZooKeeper个人笔记Session管理
  4. Python 文件遍历
  5. Codeforces Round #160 (Div. 2) D. Maxim and Restaurant(DP)
  6. 用简单直白的方式讲解A星寻路算法原理
  7. iOS-验证码倒计时60秒
  8. Codeforces Round #267 (Div. 2) C. George and Job DP
  9. msvc库没有安装包,编译选项选择 代码生成 MT【多线程】,C#调用
  10. Map集合的两种遍历方式
  11. 初学java,遇到的陌生词语(1)
  12. 转换流--OutputStreamWriter类与InputStreamReader类
  13. [Java] JavaMail 查询邮件
  14. 华夏的理财30天A和华夏财富宝货币哪个收益比较好?
  15. cocos2dx进阶学习之场景切换
  16. avuex
  17. mc面试题记录
  18. mysql 游标的使用方法
  19. ES6学习笔记四(类和对象)
  20. 为docker私有registry配置nginx反向代理

热门文章

  1. 如何将现有的项目添加到远程的git库里面!
  2. 通过slf4j/log4j的MDC/NDC 实现日志追踪
  3. Jmeter微信小程序接口测试
  4. python基础实践(三)
  5. 聊聊、Mybatis API
  6. 【bzoj4819】[Sdoi2017]新生舞会 分数规划+费用流
  7. Python列表及元组操作
  8. [Linux]创建和启用Swap交换区
  9. [codeforces] 498D Traffic Jams in th Land
  10. 转:Java NIO(2)