Description

羽月最近发现,她发动能力的过程是这样的:
构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些边依次加入图中,每次加入之后计算当前图的强连通分量个数并记下来,最后得到一个长度为E 的序列,这个序列就是能力的效果。
注意到,可能存在边的序列不同而能力效果相同的情况,所以羽月想请你帮她计算能发动的不同能力个数,答案对 998244353 取模。你需要对于1<=E<=V*(V-1)的所有 E 计算答案。

Data Constraint

对于 10%的数据,1<=V<=5
对于 30%的数据,1<=V<=20
对于 60%的数据,1<=V<=50
对于 100%的数据,1<=V<=100

solution

全场切的题目咱连题目都看不懂对咱来说已经是日常了

题解觉得这题太水于是只有一句话于是咱只好对着一份代码理解了半天

考虑一个策略,我们维护一条链\(1\)到\(i\),如果连的下一条边需要不减少强连通分量个数,那么就连上\((i,i+1)\),如果需要减少强连通分量个数,那么就在链上选一个点向前连边

不难发现,每一种强连通分量序列的情况,都可以通过这种策略来表示

考虑\(dp\),设\(dp_{i,j,k}\)表示连了\(i\)条边,上面有\(j\)个点已经在强连通分量里了,对于链维护到了\(1\)到\(k\),那么枚举下一条边,考虑它是未增加强连通分量个数或者减少的强连通分量个数,转移即可

还有一种尴尬的情况就是点全都连完了,但我们还需要使强连通分量个数不变,这种时候往前连一条没用的边就行了

顺带注意,我们在连环边和无用边的时候可能会有边爆掉的情况,设链上有\(n\)个点,有\(j\)个在环里(即强连通分量),那么链上的每个点可以向后面的所有点连边,环上的每个点可以向前面的所有点连边,就算全部连满,边数也不能超过\(\frac{n(n+1)+j(j+1)}{2}\)

然后就没有然后了,理论上来说时间复杂度\(O(v^5)\),只要用刷表法,判断一下当前状态是否可行就行了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
inline int max(const R int &x,const R int &y){return x>y?x:y;}
inline int min(const R int &x,const R int &y){return x<y?x:y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res=1,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){if(K>1<<20)Ot();if(x<0)x=-x,sr[++K]='-';while(z[++Z]=x%10+48,x/=10);while(sr[++K]=z[Z],--Z);sr[++K]=' ';
}
const int N=105,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
int dp[N*N][N][N];
int n,res;
int main(){
//  freopen("testdata.in","r",stdin);freopen("counting.in","r",stdin);freopen("counting.out","w",stdout);scanf("%d",&n);dp[0][1][1]=1;fp(i,0,n*(n-1)-1)fp(j,1,min(n,i+1))fp(k,j,min(n,i+1))if(dp[i][j][k]){if(i<=k+j-2&&k<n)dp[i+1][j][k+1]=add(dp[i+1][j][k+1],dp[i][j][k]);else if(k*(k-1)+j*(j-1)>=(i+1<<1))dp[i+1][j][k]=add(dp[i+1][j][k],dp[i][j][k]);fp(l,1,k-j)if(k*(k-1)+(j+l)*(j+l-1)>=(i+1<<1))dp[i+1][j+l][k]=add(dp[i+1][j+l][k],dp[i][j][k]);}fp(i,1,n*(n-1)){res=0;fp(j,1,min(n,i+1))fp(k,j,min(n,i+1))res=add(res,dp[i][j][k]);print(res);}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10292866.html

jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)相关推荐

  1. 【THUWC2019模拟2019.1.18】Counting

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V (V<=100)个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两 ...

  2. 6009. 【THUWC2019模拟2019.1.18】Counting

    题意: 羽月最近发现,她发动能力的过程是这样的: 构建一个 VVV 个点的有向图 GGG,初始为没有任何边,接下来羽月在脑中构建出一个长度为 EEE 的边的序列,序列中元素两两不同,然后羽月将这些边依 ...

  3. jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】

    正题 题目链接:https://gmoj.net/senior/#main/show/6067 题目大意 nnn个点的一张竞赛图,第iii个点向第jjj个点(i<j)(i<j)(i< ...

  4. jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】

    正题 题目链接:https://gmoj.net/senior/#main/show/6065 题目大意 oneness(x)oneness(x)oneness(x)表示xxx的约数中全是111的数的 ...

  5. 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 ...

  6. JZOJ6362. 【NOIP2019模拟2019.9.18】数星星(star)

    Description Solution 考虑分治,将每一个询问挂在包括它的最大的区间中. 只考虑中点往右的区间的贡献,那么每一个点对于覆盖它的最早的时间有一个贡献. 我们建一个虚树,并且用并查集路径 ...

  7. Unity3d 周分享(17期 2019.5.18 )

    选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1. [Unity]介绍可以在游戏画面上显示FPS,内存,音频,设备信息的" ...

  8. 18天精读掌握《费曼物理学讲义卷一》 第5天 2019/6/18

    18天精读掌握<费曼物理学讲义卷一> 第5天 2019/6/18 1. 18日掌握<费曼物理学讲义>卷一计划概览 2. 今日学习成果 3. 今日时间表 4.Atimelogge ...

  9. 2019.12.18

    2019.12.18 bool canBeEqual(vector<int>& target, vector<int>& arr) {if (target.si ...

最新文章

  1. CZoneSoft出品: 音频视频在线录制系列之 AV留言本 简介
  2. Spark详解(十三):Spark Streaming 运行架构分析
  3. mvc core2.1 Identity.EntityFramework Core 注册 (二)
  4. tomcat安装问题解决
  5. 入门Java开发,这三大知识体系你要知道
  6. 物联网听起来像是一个和互联网不同的网,万物互联又把网给弄丢了,正向我们扑面而来的是万物互联网。...
  7. python创建一个json_如何为Python选择一个更快的JSON库
  8. Visual Studio 代码提示选不中
  9. 八.创建型设计模式——Singleton Pattern(单例模式)
  10. 嵌入式工具——strace
  11. php字符串中删除字符串函数,PHP实现删除字符串中任何字符的函数
  12. vmware桌面云建设项目方案建议书(包含GPU)
  13. mysql with,mysql+with
  14. C++中string类
  15. 购物车中我的订单查询
  16. 智慧物流自动化智能仓储管理架构分析
  17. 算法心得:高效算法的奥秘 作者:[美] Henry S. Warren, Jr.
  18. (016) 反射 API
  19. 基于链接密度聚类的重叠社区发现算法
  20. 【ZLR-T81 200A漏电继电器】

热门文章

  1. 个人网站音乐服务器,不在是想象:教你搭建个人音乐播放网站(3)
  2. 创业兵法—选择最适合你的创业项目
  3. csgo怎么绑定一键跳投_CSGO投掷物一键跳投的设置方法
  4. “温莎当下 麦克成风”2021赛季杭州赛区决赛精彩收官
  5. 全球语言标准码及其国家或地区对照
  6. 图书馆管理系统【源码】
  7. linux使用flask设计网站,linux下Flask框架搭建简单网页
  8. webrtc QOS方法二.3(FEC冗余度配置)
  9. 雷达杂波matlab,基于MATLAB的雷达杂波建模与仿真研究
  10. 软件构造学习笔记ATD