题目链接  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;
}

Codeforces 954H Path Counting(DP)的更多相关文章

  1. Codeforces 954H Path Counting 【DP计数】*

    Codeforces 954H Path Counting LINK 题目大意:给你一棵n层的树,第i层的每个节点有a[i]个儿子节点,然后问你树上的简单路径中长度在1~n*2-2之间的每个有多少条 ...

  2. Codeforces Gym101341K:Competitions(DP)

    http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...

  3. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  4. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

  5. jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...

  6. Codeforces 1051 D.Bicolorings(DP)

    Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...

  7. Codeforces 1207C Gas Pipeline (dp)

    题目链接:http://codeforces.com/problemset/problem/1207/C 题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道 ...

  8. Codeforces 704C - Black Widow(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...

  9. Codeforces 682B New Skateboard(DP)

    题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...

随机推荐

  1. 《Cracking the Coding Interview》——第5章:位操作——题目5

    2014-03-19 06:22 题目:将整数A变成整数B,每次只能变一个二进制位,要变多少次呢. 解法:异或,然后求‘1’的个数. 代码: // 5.5 Determine the number o ...

  2. 【Python】python常用模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  3. Djano之写api使用django_rest_framework【海瑞博客】

    使用django rest framework 可以更快速和友好的编写api,当然网上有很多教程,对于高手来说相对很简单,对于新手来说,根本搞不明白.那是你没有搞明白你自己的职责,做为后端,我们只要提 ...

  4. Escape From The Earth 逃离地球

    1.对Tags进行管理 设置一个全局的类,类似如下: public class Tags:MonoBehaviour{ public const string player="Player& ...

  5. 孤荷凌寒自学python第二十一天初识python的类

    孤荷凌寒自学python第二十一天初识python的类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 类是面向对象的编程语言非常重要的概念. 编程语言的进化史中从顺序编程到结构化编程,最后才 ...

  6. Linux & Windows 查看 ip 地址

    Windows 查看本机 IP 打开 cmd,输入 ipconfig,回车,找到IPv4地址 或者通过以下方式查看 点击Win10系统的右下角的宽带连接图标,如下图所示.        点击弹出菜单的 ...

  7. inspect流程

    当node节点state为manage时,可执行inspector ironic node-set-provision-state <node_uuid> manage ironic no ...

  8. 爬虫:Scrapy15 - 调试(Debugging)Spiders

    考虑下面的 spider: import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = ...

  9. 【Android】实验7 BindService模拟通信 截止提交日期2016.5.3

    实验7 BindService模拟通信 [目的] 实现启动端和BindService之间的双向通信 [要求] 1)   实现从启动端传递一个数据至BindService端: 2)   实现使用Bind ...

  10. 【转】TCP通信的三次握手和四次撒手的详细流程(顿悟)

    TCP(Transmission Control Protocol) 传输控制协议 三次握手 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位 ...