@description@

在Byteland一共有n个城市,编号依次为1到n,形成一个n个点的竞赛图。

请写一个程序,帮助Byteasar计算有多少种道路修建方式,使得从1号点出发的最长简单路径经过点数恰好为k,由

于答案可能很大,请对P取模输出

Input

第一行包含两个正整数n,P,表示点数和模数。

2≤P≤1e9,N<=2000

Output

输出n行,第i行输出从1出发的最长简单路径经过点数恰好为i的竞赛图个数模P。

Sample Input

2 233

Sample Output

1

1

@solution@

首先根据我们竞赛图的性质,在进行强连通缩点后,一个点出发的最长简单路径长度 = 它所在强连通分量大小 + 拓扑序在它之后的点数。

至于证明,我的这篇博客里面有

考虑如果路径长度为 k 时,枚举 1 所在强连通分量的大小为 p。则只需要保证 1 之前的 n - k 个点全部向后面连边,1 之后的 k - p 个点全部由前面连过来即可,其他就没有多余的对这 n - p 个点的限制。

我们记 f[i] 表示 i 个点的竞赛图个数,g[i] 表示 i 个点的强连通竞赛图个数,则(注意要保证 1 号点一定在强连通内部):

\[ans[k] = \sum_{p=1}^{k}C_{n-1}^{n-k}*C_{k-1}^{k-p}*f[n-k]*g[p]*f[k-p]
\]

因为 \(f[i] = 2^{C_i^2}\),所以我们考虑怎么求 g。

考虑经典容斥。假如 i 个点不形成强连通,则我们枚举将 i 个点缩点后拓扑序最靠前的强连通大小,就可以容斥。即:

\[g[i] = f[i] - \sum_{j=1}^{i-1}C_{i}^{j}*g[j]*f[i-j]
\]

@accepted code@

#include<cstdio>
const int MAXN = 2000;
int f[MAXN + 5], g[MAXN + 5], h[MAXN + 5];
int c[MAXN + 5][MAXN + 5];
int n, P;
int main() {
scanf("%d%d", &n, &P);
for(int i=0;i<=n;i++) {
c[i][0] = 1;
for(int j=1;j<=i;j++)
c[i][j] = (c[i-1][j] + c[i-1][j-1])%P;
}
int tmp = 1; f[0] = f[1] = 1;
for(int i=2;i<=n;i++)
tmp = 2LL*tmp%P, f[i] = 1LL*f[i-1]*tmp%P;
for(int i=1;i<=n;i++) {
g[i] = f[i];
for(int j=1;j<i;j++)
g[i] = (g[i] + P - 1LL*c[i][j]*g[j]%P*f[i-j]%P)%P;
}
for(int i=1;i<=n;i++) {
h[i] = 0;
for(int j=1;j<=i;j++)
h[i] = (h[i] + 1LL*c[n-1][n-i]*c[i-1][i-j]%P*f[n-i]%P*g[j]%P*f[i-j]%P)%P;
}
for(int i=1;i<=n;i++)
printf("%d\n", h[i]);
}

@details@

实际实现中,并没有必要写快速幂,因为可以从 f[i-1] 直接递推到 f[i]。

@bzoj - 5219@ [Lydsy2017省队十连测]最长路径的更多相关文章

  1. bzoj5219 [Lydsy2017省队十连测] 最长路径

    题意: 做法来自 首先竞赛图缩点后是一条链,\(1\)号节点在开头的那个\(SCC\)中,因此从\(1\)号节点出发的最长链即为\(1\)号节点所在的\(SCC\)的大小\(+1\)号节点拓扑序之后的 ...

  2. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 93  Solved: 53[Submit][Status][ ...

  3. bzoj 5216: [Lydsy2017省队十连测]公路建设

    5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 66  Solved: 37[Submit][St ...

  4. bzoj 5218: [Lydsy2017省队十连测]友好城市

    题意: 这题显然直接tarjan是做不了的. 这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客 于是结合莫队,我们有了个暴力. 发现主要瓶颈是dfs过程中找最小的未经过的点,我们用 ...

  5. bzoj 5217: [Lydsy2017省队十连测]航海舰队

    Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置 ...

  6. BZOJ 5215: [Lydsy2017省队十连测]商店购物

    裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005 ...

  7. Lydsy2017省队十连测

    5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...

  8. 【BZOJ 5222】[Lydsy2017省队十连测]怪题

    题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...

  9. 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)

    传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...

随机推荐

  1. Ubuntu linux下部署golang配置环境,极客学院 无闻讲的安装配置是错的,折腾我好几遍,真是有点坑

    开始按极客学院无闻讲的做,弄了几遍都不行,最后发现是错的,别人告诉我这是mac下的virtualbox是这样的,不管怎样,被坑的不浅. 虽然sudo apt install golang-go 就能安 ...

  2. 基础篇-1.4Java流程语句的基础

    1 条件语句 条件语句,即类似 if...else... 的语句,一个if语句包含了一个布尔表达式,以及一个或多个语句. if语句语法 if(布尔表达式) { // 布尔表达式为true时执行的语句块 ...

  3. python基础--文件相关操作

    文件操作方式的补充: “+”表示的是可以同时读写某个文件 r+:可读可写 w+:可读可写 a+:可读可写 x:只写模式[不可读:不存在则创建,存在则报错] x+:可读可写 文件内的光标移动: 1.re ...

  4. 【同余最短路】洛谷 P2662 牛场围栏

    关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...

  5. ES6中async和await说明和用法

    昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await 已经被标准化,是时候学习一下了. 先说一下async的用法,它作为一个 ...

  6. webpack学习之——Entry Points(入口起点)

    1.Entry property(entry属性) 1.1 Single Entry (Shorthand) Syntax(单个入口语法) 用法:entry: string | Array<st ...

  7. VUE ECharts人际关系图

    1. 概述 1.1 说明 项目中需要对某个人的人际关系进行展示,故使用echarts中的关系图进行处理此需求. 2. 代码 2.1 代码示例 <template> <div clas ...

  8. Hibernate的DetachedCriteria使用(含Criteria)转载

    https://www.cnblogs.com/deng-cc/p/6428599.html 1.背景了解:Hibernate的三种查询方式 Hibernate总的来说共有三种查询方式:HQL.QBC ...

  9. 非接触型手掌静脉识别 PalmSecure™

    静脉识别,使用近红外线读取静脉模式,与存储的静脉模式进行比较,进行本人识别的识别技术.富士通的PalmSecure™,利用该技术,由离开识别装置的位置,使用近红外线拍摄,与预先存储的静脉模式进行比较从 ...

  10. No.1 Verilog HDL简介

       硬件描述语言HDL(Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言.设计者利用HDL可以从抽象到具体逐层描述自己的设计思想,用一系列的分 ...