Description

在Byteland一共有n个城市,编号依次为1到n,它们之间计划修建n(n-1)/2条单向道路,对于任意两个不同的点i和

j,在它们之间有且仅有一条单向道路,方向要么是i到j,要么是j到i。换句话说,这是一个n个点的竞赛图。Byte

asar居住在1号城市,他希望从1号城市出发,沿着单向道路不重复地访问一些城市,使得访问的城市数尽可能多。

请写一个程序,帮助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


题解

计数题我永远都写不出来

先扯点竞赛图的前置知识

1.竞赛图就是有向完全图,有\(C_{2}^{n}\)条有向边

2.竞赛图经过缩点后一定是一条链,拓扑序小的连向所有拓扑序比ta大的节点

3.竞赛图是一个哈密顿回路,竞赛图在缩点后是一个哈密顿路径

4.竞赛图要不就是没有一个环的\(DAG\),要不就是每个强连通分量的点的个数至少为3,且每个强连通分量都有至少一个三元环

由于竞赛图缩点以后一定是一条链

所以从\(1\)开始的路径长度就是\(1\)所在的\(scc\)大小+拓扑序在\(i\)所在的\(scc\)后面的点的个数

我们设\(g_i\)表示\(i\)个点的竞赛图个数

\(f_i\)表示一个大小为\(i\)的是一个强连通分量的竞赛图的个数

那么显然\(g_n=2^{C_{2}^{n}}\)

然后我们考虑怎么求\(f_i\)

其实直接容斥就行了

就枚举一个大小为\(j[j<i]\)的强连通分量竞赛图

然后剩下的\(i-j\)个点就不在这个强连通分量里

所以这两者之间的边的方向是一定的

\(f_i=\sum_{j=1}^{i-1}{C_{i}^{j}f_jg_{i-j}}\)

然后我们就枚举\(1\)所在\(scc\)大小\(i\),再枚举拓扑序大于\(1\)所在的\(scc\)的点的个数\(j\)

\(ans[i+j]=C_{n-1}^{i}\times C_{j}^{n-i}f_ig_jg_{n-i-j}\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
const int M = 2005 ;
using namespace std ; int n , mod ;
int f[M] , g[M] , ans[M] , C[M][M] ;// f[i]表示一个联通块, g[i]表示i个点随便连
inline int Fpw(int Base , int k) {
int temp = 1 ;
while(k) {
if(k & 1) temp = 1LL * temp * Base % mod ;
Base = 1LL * Base * Base % mod ; k >>= 1 ;
}
return temp ;
}
int main() {
scanf("%d%d",&n,&mod) ;
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]) % mod ;
}
for(int i = 0 ; i <= n ; i ++)
g[i] = Fpw(2 , C[i][2]) ;
for(int i = 1 ; i <= n ; i ++) {
f[i] = g[i] ;
for(int j = 1 ; j < i ; j ++) {
f[i] = (f[i] - 1LL * C[i][j] * f[j] % mod * g[i - j] % mod) % mod ;
f[i] = (f[i] + mod) % mod ;
}
}
for(int i = 1 ; i <= n ; i ++)
for(int j = 0 ; i + j <= n ; j ++)
ans[i + j] = (ans[i + j] + 1LL * C[n - 1][i - 1] * C[n - i][j] % mod * f[i] % mod * g[j] % mod * g[n - i - j] % mod) % mod ;
for(int i = 1 ; i <= n ; i ++) printf("%d\n",ans[i]) ;
return 0 ;
}

[BZOJ5219]最长路径的更多相关文章

  1. ubuntu 终端设置(颜色与长路径)

    Linux给人最大的享受就是可以根据个人喜好去定制令自己舒服的系统配置,像终端颜色的设置就是一个典型的例子. 图1 系统默认状态下的终端显示     在没有经过自定义配置的终端下工作久了,难免容易疲劳 ...

  2. Codefroces Gym 100781A(树上最长路径)

    http://codeforces.com/gym/100781/attachments 题意:有N个点,M条边,问对两两之间的树添加一条边之后,让整棵大树最远的点对之间的距离最近,问这个最近距离是多 ...

  3. 【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)

    Walking Race   Description flymouse's sister wc is very capable at sports and her favorite event is ...

  4. hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. AOE网上的关键路径(最长路径 + 打印路径)

    题目描述 一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图.     AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG ...

  6. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)

    题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...

  7. Going from u to v or from v to u? POJ - 2762(强连通 有向最长路径)

    In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, an ...

  8. HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径)

    HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径) Description A group of researchers ar ...

  9. 旅行商问题(TSP)、最长路径问题与哈密尔顿回路之间的联系(归约)

    一,旅行商问题与H回路的联系(H回路 定义为 哈密尔顿回路) 旅行商问题是希望售货员恰好访问每个城市一次,最终回到起始城市所用的费用最低,也即判断图中是否存在一个费用至多为K的回路.(K相当于图中顶点 ...

随机推荐

  1. iOS 开发中的一些注意点(安全、当前语言、时间格式化)

    1.重复运行项目,不重复构建项目(来自Heath Borders) 假如你一直在不停地调试同一个问题,你可以在不重复构建的情况下运行你的APP,这样:“Product>Perform Actio ...

  2. 基于S3C2440的linux-3.6.6移植——LED驱动【转】

    本文转载自:http://www.voidcn.com/blog/lqxandroid2012/article/p-625005.html 目前的linux版本的许多驱动都是基于设备模型,LED也不例 ...

  3. 一个测试基础面试题——如何测试web银行开户

    之前面试被问到过这样一个问题,自己答的都是一些UI界面上的case,看了一些大神的关于这类面试题的总结才知道自己差的不是一点半点,今天也总结下. 内管银行开户,有账号.用户名.用户证件类型.证件号三个 ...

  4. maven中常用命令

    1. 更新本地仓库, 首先确认C:\users\pengqiong\ 路径下有相应的pom文件 mvn clean package install:

  5. codeforces 669B B. Little Artem and Grasshopper(水题)

    题目链接: B. Little Artem and Grasshopper time limit per test 2 seconds memory limit per test 256 megaby ...

  6. 万径人踪灭(FFT+manacher)

    传送门 这题--我觉得像我这样的菜鸡选手难以想出来-- 题目要求求出一些子序列,使得其关于某个位置是对称的,而且不能是连续一段,求这样的子序列的个数.这个直接求很困难,但是我们可以先求出所有关于某个位 ...

  7. darknet源码学习

    darknet是一个较为轻型的完全基于C与CUDA的开源深度学习框架,其主要特点就是容易安装,没有任何依赖项(OpenCV都可以不用),移植性非常好,支持CPU与GPU两种计算方式.1.test源码( ...

  8. java 02 内部类

  9. CodeForces 1098E. Fedya the Potter

    题目简述:给定长度为$n \leq 5\times 10^4$的序列$a_1, a_2, \dots, a_n \leq 10^5$.将$\gcd(a_l, a_{l+1}, \dots, a_r) ...

  10. UVa 1645 Count (递推,数论)

    题意:给定一棵 n 个结点的有根树,使得每个深度中所有结点的子结点数相同.求多棵这样的树. 析:首先这棵树是有根的,那么肯定有一个根结点,然后剩下的再看能不能再分成深度相同的子树,也就是说是不是它的约 ...