@bzoj - 5219@ [Lydsy2017省队十连测]最长路径
@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 号点一定在强连通内部):
\]
因为 \(f[i] = 2^{C_i^2}\),所以我们考虑怎么求 g。
考虑经典容斥。假如 i 个点不形成强连通,则我们枚举将 i 个点缩点后拓扑序最靠前的强连通大小,就可以容斥。即:
\]
@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省队十连测]最长路径的更多相关文章
- bzoj5219 [Lydsy2017省队十连测] 最长路径
题意: 做法来自 首先竞赛图缩点后是一条链,\(1\)号节点在开头的那个\(SCC\)中,因此从\(1\)号节点出发的最长链即为\(1\)号节点所在的\(SCC\)的大小\(+1\)号节点拓扑序之后的 ...
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 93 Solved: 53[Submit][Status][ ...
- bzoj 5216: [Lydsy2017省队十连测]公路建设
5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 66 Solved: 37[Submit][St ...
- bzoj 5218: [Lydsy2017省队十连测]友好城市
题意: 这题显然直接tarjan是做不了的. 这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客 于是结合莫队,我们有了个暴力. 发现主要瓶颈是dfs过程中找最小的未经过的点,我们用 ...
- bzoj 5217: [Lydsy2017省队十连测]航海舰队
Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置 ...
- BZOJ 5215: [Lydsy2017省队十连测]商店购物
裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005 ...
- Lydsy2017省队十连测
5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...
- 【BZOJ 5222】[Lydsy2017省队十连测]怪题
题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...
- 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)
传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...
随机推荐
- redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化
简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMwa ...
- 记录centos7下tomcat部署war包过程
记录centos7下tomcat部署war包过程 1.官网下载tomcat安装包.gz结尾的 2.上传到/usr/local/ ,并解压到tomcat目录下 3.进入tomcat/bin目录,运行./ ...
- tomcat9 gzip
我认为apr模式比较屌所以 <Connector port=" protocol="org.apache.coyote.http11.Http11AprProtocol&qu ...
- java.lang.IllegalStateException: 1 matchers expected, 5 recorded.
这是一个很神奇的错误. 常规的出错是因为在mock方法里,其中某一个或者几个参数使用了EasyMock.anyxx(),而其他的使用了具体的值. java.lang.IllegalStateExcep ...
- NLog系列之NLong.config变量配置篇
$ {cached} - 将缓存应用于另一个布局输出. $ {db-null} - 为数据库渲染DbNull $ {exception} - 通过调用Logger方法之一提供的异常信息 $ {lev ...
- LUOGU P1053 篝火晚会 (Noip 2015 )
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 nnn 个同学,编号 ...
- git pull 提示错误,Your local changes to the following files would be overwritten by merge
error: Your local changes to the following files would be overwritten by merge: Please commit your c ...
- GBRT(GBDT)(MART)(Tree Net)(Tree link)
源于博客 GBRT(梯度提升回归树)有好多名字,标题全是它的别名. 它是一种迭代的回归树算法,由多棵回归树组成,所有树的结论累加起来得到最终结果.在被提出之初与SVM一起被认为是泛化能力较强的算法. ...
- 为什么要用Spring的依赖注入
最近写了一些Spring项目,用到了依赖注入,但是不知道为甚么要用,后来在知乎上看了一些大家的回答,觉得很精辟,遂简单总结一下. 主要是实现类之间的解耦,假如A类依赖B类,在实例化A类的话也要new一 ...
- Sublime Text 2 快捷键用法大全
Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑) Ctrl+G 跳转到相应的行 Ctrl+J 合并行(已选择需要合并的多行时) Ctrl+L 选择整行(按住-继续 ...