JZOJ 5923. 【NOIP2018模拟10.23】Bomb
Description
常数国与 Hack 国近年来战火纷飞。
常数国共有 n 个城市,每两个城市之间均有一条交通线联通。如今常数国遭到 Hack 国的重创,岌岌可危。Hack 国国王小 K 决定轰炸常数国的交通线,对常数国发起最后的攻击。
面对危难之时,常数国国王决定更换首都。在 Hack 国的轰炸结束之后,常数国的领土将会分成若干个联通块。常数国的首都,将会从联通块大小最大的联通块中,随机选择一个城市,作为首都。
小 K 得知了常数国的应对方案之后,他想知道,Hack 国有多少种不同的轰炸方案,使得常数首都所在的联通块大小恰好为 k。两种轰炸方案是不同的,当且仅当一条交通线在一种方案中存在,在另一种方案中被轰炸。由于方案数可能很大,你需要输出方案数对 998,244,353 取模的结果。
Input
从文件bomb.in中读入数据。
共一行,两个整数 n,k ,表示常数国城市的个数与首都所在联通块大小。
Output
输出到文件bomb.out中。
共一行,表示 Hack 国的轰炸方案数对 998,244,353 取模后的结果。
Sample Input
Sample Input 1
3 2
Sample Input 2
5 3
Sample 3
见选手目录下的bomb/bomb3.in与bomb/bomb3.ans。
该组样例的数据范围同第 8 个测试点。
Sample Output
Sample Output1
3
Explanation
3 种方案分别为,仅保留 1 号城市与 2 号城市的交通线,仅保留 2 号城市与3 号城市的交通线,仅保留 1 号城市与 3 号城市的交通线。
Sample Output2
80
Data Constraint
对于 100% 的数据,满足 1 ≤ k ≤ n ≤ 2 × 10 3 。除此之外,对于每个数据点,还满足以下限制。
Solution
我们需要灵活地DP!
考虑设 f[i]f[i]f[i] 表示大小为 iii 的连通图的个数。
为了求出 f[i]f[i]f[i] ,我们再设一个 h[i]h[i]h[i] 表示大小为 iii 的图的个数。
则有:h[0]=1,h[i]=h[i−1]∗2i−1h[0]=1,h[i]=h[i-1]*2^{i-1}h[0]=1,h[i]=h[i−1]∗2i−1
即:h[i]=2Ci2h[i]=2^{C_{i}^{2}}h[i]=2Ci2
那么 f[i]f[i]f[i] 就很好求了:f[i]=h[i]−∑j=1i−1Ci−1j−1∗f[j]∗h[i−j]f[i]=h[i]-\sum_{j=1}^{i-1}C_{i-1}^{j-1}*f[j]*h[i-j]f[i]=h[i]−j=1∑i−1Ci−1j−1∗f[j]∗h[i−j]
注意这些点是有编号的,所以组合数应为 Ci−1j−1C_{i-1}^{j-1}Ci−1j−1 而非 CijC_{i}^{j}Cij 。
求出了 f[i]f[i]f[i] 我们就更容易求出答案了。
设 g[i]g[i]g[i] 为大小为 iii 的图的个数,其中这些图中的连通块大小不超过 kkk。
于是就有转移:g[i]=∑j=1min(i,k)Ci−1j−1∗f[j]∗g[i−j]g[i]=\sum_{j=1}^{min(i,k)}C_{i-1}^{j-1}*f[j]*g[i-j]g[i]=j=1∑min(i,k)Ci−1j−1∗f[j]∗g[i−j]
由于 ggg 表示的图的连通块大小 ≤k\leq k≤k ,那么我们又设一个 g1[i]g1[i]g1[i] 表示 ≤k−1\leq k-1≤k−1 的。
转移即把上面的 kkk 换成 k−1k-1k−1。
那么答案就是 g[n]−g1[n]g[n]-g1[n]g[n]−g1[n] 。
时间复杂度 O(n2)O(n^2)O(n2) ,用FFT优化可达 O(nlogn)O(n\ log\ n)O(n log n) 。
这题的DP方式比较套路,但是如果之前没接触过的话就不是特别好想,需要多积累。
Code
#include<cstdio>
#include<cctype>
using namespace std;
typedef long long LL;
const int N=2005,mo=998244353;
int f[N],g[N],g1[N],h[N],c[N][N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int ksm(int x,int y)
{int s=1;while(y){if(y&1) s=(LL)s*x%mo;x=(LL)x*x%mo;y>>=1;}return s;
}
int main()
{freopen("bomb.in","r",stdin);freopen("bomb.out","w",stdout);int n=read(),k=read();for(int i=0;i<=n;i++) c[i][0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mo;f[0]=g[0]=g1[0]=h[0]=1;for(int i=1;i<=n;i++){h[i]=ksm(2,i*(i-1)/2);for(int j=1;j<i;j++)f[i]=(f[i]+(LL)c[i-1][j-1]*f[j]%mo*h[i-j])%mo;f[i]=(mo-f[i]+h[i])%mo;for(int j=1,up=i<k?i:k;j<=up;j++) g[i]=(g[i]+(LL)c[i-1][j-1]*f[j]%mo*g[i-j])%mo;for(int j=1,up=i<k-1?i:k-1;j<=up;j++) g1[i]=(g1[i]+(LL)c[i-1][j-1]*f[j]%mo*g1[i-j])%mo;}printf("%d",(g[n]-g1[n]+mo)%mo);return 0;
}
JZOJ 5923. 【NOIP2018模拟10.23】Bomb相关推荐
- JZOJ 5924. 【NOIP2018模拟10.23】Queue
Description Hack 国的居民人人都是 OI 大师,Hometown 得知便赶紧来到 Hack 国学习.可想要进入 Hack 国并不是件容易的事情,首先就必须通过 Hack 国海关小 B ...
- JZOJ 5922. 【NOIP2018模拟10.23】sequence
Description 小 F 是一位 Hack 国的居民,他生活在一条长度为 n 的街道上,这个街道上总共有 n 个商店.每个商店里售卖着不同的 Hack 技能包,每个商店本身也会有个便利值.初始时 ...
- JZOJ5922. 【NOIP2018模拟10.23】sequence
传送门 preface 这道题想了好久好久主要是菜,但其实并不是很难,大佬现在走还来得及.... 分析 这道题乍一看没什么想法,暴力50pts骗走溜掉.但其实那个特殊点提示很大. 对于第5个点的话,把 ...
- [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)
题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城 ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)
5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...
- jzoj5904. 【NOIP2018模拟10.15】刺客信条(并查集)
5904. [NOIP2018模拟10.15]刺客信条 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一 ...
- jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)
5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...
- JZOJ 5939. 【NOIP2018模拟10.30】阻击计划
Description 最近,小J发现小R和小Z之间的关系十分密切,心中十分嫉妒,为了拆散他们,小J经常扰乱他们一起玩耍的计划. 问题描述 小R和小Z打算在这个周末一起骑车在G国的城市看风景,G国的城 ...
最新文章
- 这八个步骤,Python让你轻松爬取B站弹幕,网友看了都说6
- python学习第二课要点记录
- 《疯狂JAVA讲义》笔记1
- 这个顶会论文复现比赛,单篇最高现金奖3W!
- Window10/Linux 下安装 scrapy (twisted 安装失败的解决办法 )
- python众数问题给定含有n个元素的多重集合s_2-1 问题描述:给定含有n个元素的多重集合S - 下载 - 搜珍网...
- linux查看cpu占用最多的进程,Linux下查看占用CPU资源最多的几个进程
- QQ网页链接打开本地QQ.exe原理
- Python笔记---错误笔记
- x5内核html5,X5内核+HTML5应用 Q立方浏览器预览版
- Web前端第一季(HTML):十四:课时 38 : 309-文本域完成大段文本的输入+课时 39 : 310-表单的属性+课时 40 : 311-文件上传
- hyperledger fabric 测试(九)couch DB数据库设置
- 移动电信联通三大运营商的“流量不清零”,谁最坑?
- 使用 GOLANG 发送邮件
- The reCAPTCHA was invalid. Go back and try it again.
- 观察者模式(java)浅析
- PVLAN 技术介绍
- http.ListenAndServe
- 阿里云服务器ECS安装Ubuntu18.04桌面图形环境
- JavaWeb - 验证码
热门文章
- 转:如何调用另一个python文件中的代码
- 【转】Ubuntu 安装截图工具Shutter,并设置快捷键 Ctrl+Alt+A
- linux无效家目录,Linux 家目录下文件夹消失?
- sublime编译python文件提示can't find '__main__' module in ' '
- 科大星云诗社动态20201118
- 云炬随笔20180607
- [scala-spark]10. RDD转换操作
- Visual Studio集成Qt环境搭建_详解与测试
- [Medical Image Processing] 2. Image Binary -【OTSU Algorithm Entropy Method】
- ARM/THUMB汇编(补丁开发类)基础教程