6009. 【THUWC2019模拟2019.1.18】Counting
题意:
羽月最近发现,她发动能力的过程是这样的:
构建一个 VVV 个点的有向图 GGG,初始为没有任何边,接下来羽月在脑中构建出一个长度为 EEE 的边的序列,序列中元素两两不同,然后羽月将这些边依次加入图中,每次加入之后计算当前图的强连通分量个数并记下来,最后得到一个长度为EEE 的序列,这个序列就是能力的效果。
注意到,可能存在边的序列不同而能力效果相同的情况,所以羽月想请你帮她计算能发动的不同能力个数,答案对 998244353998244353998244353 取模。你需要对于1≤E≤V∗(V−1)1\leq E \leq V*(V-1)1≤E≤V∗(V−1)的所有 EEE 计算答案。
数据范围:
对于 101010%的数据,1≤V≤51 \leq V \leq 51≤V≤5
对于 303030%的数据,1≤V≤201 \leq V \leq 201≤V≤20
对于 606060%的数据,1≤V≤501 \leq V \leq 501≤V≤50
对于 100100100%的数据,1≤V≤1001 \leq V \leq 1001≤V≤100
Analysis:
我们发现有用的仅仅是那个每一步的强连通分量序列。
一开始有nnn个强连通分量,我们考虑用简单的情况构造。
从111伸出去到iii一条链,然后剩余是单独的点也是强连通分量,在那条链上不断缩强连通分量,这样我们可以涵盖所有强连通分量变化的情况。
考虑每一步怎么变,要不是新加一个点到链上,或者往前连一条没用的边(保持连通分量不变),要不就是一个点往前连一条环边然后和前面的点缩到一起。注意连没用的边一定是在把所有的点加到链上之后,因为他们产生的效果相同,这里在转移的时候要特判。
那么我们考虑设fi,j,kf_{i,j,k}fi,j,k表示当前用了iii条边,在链上前面的连通分量里的点是111~jjj,链上一共有kkk个点。
那么转移就如上即可,注意判掉不合法情况,就是连没用边和环边时,边可能会超出能连数目。我们考虑链上有nnn个点,有iii个点在环内。那么nnn个点可以往后连,iii个点可以往前连,那么一共可以连n∗(n−1)+i∗(i−1)2\frac{n*(n-1)+i*(i-1)}{2}2n∗(n−1)+i∗(i−1)条边。
我们发现涉及到的状态一共也只有V4V^4V4个,因此暴力转移即可。
复杂度O(V4)O(V^4)O(V4)
Code:
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int N = 1e2 + 5;
const int mo = 998244353;
int f[N * (N - 1)][N][N];
int n;
inline int inc(int x,int y)
{ return x + y >= mo ? x + y - mo : x + y; }
inline int dec(int x,int y)
{ return x - y < 0 ? x - y + mo : x - y; }
int main()
{freopen("counting.in","r",stdin);freopen("counting.out","w",stdout);scanf("%d",&n);f[0][1][1] = 1;for (int i = 0 ; i < n * (n - 1) ; ++i)for (int j = 1 ; j <= min(n,i + 1) ; ++j)for (int k = j ; k <= min(n,i + 1) ; ++k)if (f[i][j][k]){if (i <= k + j - 2 && k < n) f[i + 1][j][k + 1] = inc(f[i + 1][j][k + 1],f[i][j][k]);else if ((k * (k - 1) + j * (j - 1)) / 2 >= i + 1) f[i + 1][j][k] = inc(f[i + 1][j][k],f[i][j][k]);for (int l = 1 ; l <= k - j ; ++l)if ((k * (k - 1) + (j + l) * (j + l - 1)) / 2 >= i + 1) f[i + 1][j + l][k] = inc(f[i + 1][j + l][k],f[i][j][k]);}for (int i = 1 ; i <= n * (n - 1) ; ++i){int ans = 0;for (int j = 1 ; j <= min(n,i + 1) ; ++j)for (int k = j ; k <= min(n,i + 1) ; ++k) ans = inc(ans,f[i][j][k]);printf("%d ",ans);}return 0;
}
6009. 【THUWC2019模拟2019.1.18】Counting相关推荐
- 【THUWC2019模拟2019.1.18】Counting
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V (V<=100)个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两 ...
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
- jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】
正题 题目链接:https://gmoj.net/senior/#main/show/6067 题目大意 nnn个点的一张竞赛图,第iii个点向第jjj个点(i<j)(i<j)(i< ...
- jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】
正题 题目链接:https://gmoj.net/senior/#main/show/6065 题目大意 oneness(x)oneness(x)oneness(x)表示xxx的约数中全是111的数的 ...
- 6360. 【NOIP2019模拟2019.9.18】最大菱形和(rhombus)
Description Input Output Sample Input 5 5 2 0 1 5 7 3 -4 2 0 -9 8 3 9 0 7 8 2 -4 5 -7 1 4 5 8 7 0 6 ...
- JZOJ6362. 【NOIP2019模拟2019.9.18】数星星(star)
Description Solution 考虑分治,将每一个询问挂在包括它的最大的区间中. 只考虑中点往右的区间的贡献,那么每一个点对于覆盖它的最早的时间有一个贡献. 我们建一个虚树,并且用并查集路径 ...
- Unity3d 周分享(17期 2019.5.18 )
选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1. [Unity]介绍可以在游戏画面上显示FPS,内存,音频,设备信息的" ...
- 18天精读掌握《费曼物理学讲义卷一》 第5天 2019/6/18
18天精读掌握<费曼物理学讲义卷一> 第5天 2019/6/18 1. 18日掌握<费曼物理学讲义>卷一计划概览 2. 今日学习成果 3. 今日时间表 4.Atimelogge ...
- 2019.12.18
2019.12.18 bool canBeEqual(vector<int>& target, vector<int>& arr) {if (target.si ...
最新文章
- 【数据结构】顺序表的应用(3)(C语言)
- 如何攻击Java Web应用【转载】
- 1.信号处理之:kill(),alarm(),pause()函数
- rails采用MongoDB感觉相当不错!
- winform闪屏问题解决方案
- vue:无法将“vue”识别为脚本_「前端架构」React和Vue -CTO的选择正确框架的指南...
- 设计灵感素材网站:美工设计者必备
- 第一章python绝对温标身体质量指数bmi
- 解决 找不到方法:“Void System.Web.UI.HtmlControls.HtmlForm.set_Action(System.String)”。
- cruise软件模型,混动仿真模型,IMMD架构混联混动仿真模型
- Linux C/C++之TCP / UDP通信
- EtherCAT运动控制卡开发教程之Qt(下):SCARA机械手正反解的建立
- Direct Rendering RenderMan Point Cloud
- 考研英语词汇(部分)快速记忆
- 哈尔滨工业大学考研试题泄密了?官方通报:不存在
- ROS:rosbag play系列指令(详解)
- Redis进阶:布隆过滤器(Bloom Filter)及误判率数学推导
- 品牌与商家如何做电商直播运营的呢?
- 运营商大数据是什么,是如何实现精准获客的
- 精选(36) 常见的五种MySQL高可用方案分析