题解:AT_arc163_d [ARC163D] Sum of SCC
题目传送门
题意
给出
分析
首先要知道什么事竞赛图,竞赛图简单来说就是有向完全图。竞赛图有很多重要的性质,我们在这题中需要用到其中一个,即竞赛图缩完点后呈链状。如下图所示。
图中标红的边,我称之为主边,蓝色的称之为副边,他们都是竞赛图缩完点后的边。
接下来,急需注意力。我们注意到对于每一条主边,我们如果把它断开,主边左边的点为集合
知道该怎么算后,我们考虑怎么具体实现。考虑
最终是同级答案,答案统计满足
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
const int N=50;
ll n,m,c[N*N][N*N],dp[N][N][N*N>>1],ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
ll len=n*(n-1)/2;
c[0][0]=1;
for(int i=1;i<=len;i++){
c[i][0]=1;
for(int j=1;j<=i;j++){
c[i][j]=c[i-1][j-1]+c[i-1][j];
c[i][j]%=mod;
}
}
dp[0][0][0]=1;
for(int u=0;u<n;u++){
for(int i=0,j=u;i<=u;i++,j--){
for(int k=0;k<=m;k++){
for(int x=0;k+x<=m;x++){
(dp[i+1][j][k+x]+=dp[i][j][k]*c[i][x]%mod)%=mod;
(dp[i][j+1][k+x+i]+=dp[i][j][k]*c[j][x]%mod)%=mod;
}
}
}
}
for(int i=0;i<=n;i++) ans=(ans+dp[i][n-i][m])%mod;
cout<<(ans-c[len][m]+mod)%mod;
return 0;
}