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−1​Ci−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相关推荐

  1. JZOJ 5924. 【NOIP2018模拟10.23】Queue

    Description Hack 国的居民人人都是 OI 大师,Hometown 得知便赶紧来到 Hack 国学习.可想要进入 Hack 国并不是件容易的事情,首先就必须通过 Hack 国海关小 B ...

  2. JZOJ 5922. 【NOIP2018模拟10.23】sequence

    Description 小 F 是一位 Hack 国的居民,他生活在一条长度为 n 的街道上,这个街道上总共有 n 个商店.每个商店里售卖着不同的 Hack 技能包,每个商店本身也会有个便利值.初始时 ...

  3. JZOJ5922. 【NOIP2018模拟10.23】sequence

    传送门 preface 这道题想了好久好久主要是菜,但其实并不是很难,大佬现在走还来得及.... 分析 这道题乍一看没什么想法,暴力50pts骗走溜掉.但其实那个特殊点提示很大. 对于第5个点的话,把 ...

  4. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城 ...

  5. [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)

    题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才.       ...

  6. jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)

    5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...

  7. jzoj5904. 【NOIP2018模拟10.15】刺客信条(并查集)

    5904. [NOIP2018模拟10.15]刺客信条 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一 ...

  8. jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)

    5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...

  9. JZOJ 5939. 【NOIP2018模拟10.30】阻击计划

    Description 最近,小J发现小R和小Z之间的关系十分密切,心中十分嫉妒,为了拆散他们,小J经常扰乱他们一起玩耍的计划. 问题描述 小R和小Z打算在这个周末一起骑车在G国的城市看风景,G国的城 ...

最新文章

  1. 这八个步骤,Python让你轻松爬取B站弹幕,网友看了都说6
  2. python学习第二课要点记录
  3. 《疯狂JAVA讲义》笔记1
  4. 这个顶会论文复现比赛,单篇最高现金奖3W!
  5. Window10/Linux 下安装 scrapy (twisted 安装失败的解决办法 )
  6. python众数问题给定含有n个元素的多重集合s_2-1 问题描述:给定含有n个元素的多重集合S - 下载 - 搜珍网...
  7. linux查看cpu占用最多的进程,Linux下查看占用CPU资源最多的几个进程
  8. QQ网页链接打开本地QQ.exe原理
  9. Python笔记---错误笔记
  10. x5内核html5,X5内核+HTML5应用 Q立方浏览器预览版
  11. Web前端第一季(HTML):十四:课时 38 : 309-文本域完成大段文本的输入+课时 39 : 310-表单的属性+课时 40 : 311-文件上传
  12. hyperledger fabric 测试(九)couch DB数据库设置
  13. 移动电信联通三大运营商的“流量不清零”,谁最坑?
  14. 使用 GOLANG 发送邮件
  15. The reCAPTCHA was invalid. Go back and try it again.
  16. 观察者模式(java)浅析
  17. PVLAN 技术介绍
  18. http.ListenAndServe
  19. 阿里云服务器ECS安装Ubuntu18.04桌面图形环境
  20. JavaWeb - 验证码

热门文章

  1. 转:如何调用另一个python文件中的代码
  2. 【转】Ubuntu 安装截图工具Shutter,并设置快捷键 Ctrl+Alt+A
  3. linux无效家目录,Linux 家目录下文件夹消失?
  4. sublime编译python文件提示can't find '__main__' module in ' '
  5. 科大星云诗社动态20201118
  6. 云炬随笔20180607
  7. [scala-spark]10. RDD转换操作
  8. Visual Studio集成Qt环境搭建_详解与测试
  9. [Medical Image Processing] 2. Image Binary -【OTSU Algorithm Entropy Method】
  10. ARM/THUMB汇编(补丁开发类)基础教程