首页 > 其他分享 >[ARC163D] Sum of SCC 题解

[ARC163D] Sum of SCC 题解

时间:2024-01-29 22:56:57浏览次数:31  
标签:typedef ch int 题解 Sum SCC read long define

题目链接

点击打开链接

题目解法

好牛的性质!!!

首先一个家喻户晓的性质是:竞赛图缩点之后是一条链
考虑从这个上面拓展出一个更优美的性质:
竞赛图的 \(scc\) 个数 \(=\) 把点集分成两个集合 \(A,B\),满足 \(\forall u\in A,v\in B\),\(u,v\) 之间边的方向为 \(u\to v\) 的方案数 \(-1\)

这样就容易 \(dp\) 了,令 \(f_{i,j,k}\) 表示当前加入了前 \(i\) 个点,集合 \(A\) 中有 \(j\) 个点,当前满足 \(u<v,u\to v\) 的边有 \(k\) 条的方案数
转移是简单的

  • 加入集合 \(A\),\(f_{i,j,k}\times \binom{j}{l}\Rightarrow f_{i+1,j+1,k+l}\),\(l\in[0,j]\)
  • 加入集合 \(B\),\(f_{i,j,k}\times \binom{i-j}{l}\Rightarrow f_{i+1,j,k+j+l}\),\(l\in [0,i-j]\)

时间复杂度 \(O(n^3m)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=32,P=998244353;
int n,m,f[N][N][N*N],C[N][N];
inline void inc(int &x,int y){ x+=y;if(x>=P) x-=P;}
int main(){
    n=read(),m=read();
    C[0][0]=1;
    F(i,1,n){ C[i][0]=C[i][i]=1;F(j,1,i-1) C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;}
    f[0][0][0]=1;
    F(i,0,n-1) F(j,0,i) F(k,0,m) if(f[i][j][k]){
        //add to A
        F(l,0,j) inc(f[i+1][j+1][k+l],1ll*f[i][j][k]*C[j][l]%P);
        //add to B
        F(l,0,i-j) inc(f[i+1][j][k+j+l],1ll*f[i][j][k]*C[i-j][l]%P);
    }
    int ans=0;
    F(i,1,n) inc(ans,f[n][i][m]);
    printf("%d\n",ans);
    return 0;
}

标签:typedef,ch,int,题解,Sum,SCC,read,long,define
From: https://www.cnblogs.com/Farmer-djx/p/17995522

相关文章

  • CF1925B A Balanced Problemset? 题解
    CF1925B题解题目链接CodeforcesLuogu题目大意有一个长度为\(n\)且和为\(x\)的正整数序列,询问该序列可能的最大公因数。多测。简要思路首先先给出结论:最终的答案一定是\(x\)的因数。接下来我通过两种方法证明:一、类似于“更相减损法”一个序列的\(\gcd\)等于......
  • TUniDBGrid控件之Summary例子
    TUniDBGrid控件之Summary例子(记录一下,方便以后备查)在这个例子中,主要用到TUniDBGrid、TClientDataSet和TDataSource三个控件。本文除去介绍使用TUniDBGrid控件之Summary外,TClientDataSet使用FieldDefs用于自定义的字段名表(即:不使用dataprovider)参考:Delphi中ClientDataSet的用......
  • 2024 USACO 题解
    BronzeSilverT1Question给你长度为\(n\)的序列\(c\),$0\lec_i\leC$。若当前位置为\(0\)则表示这个数未知,要求你填数使得序列字典序最小,并满足给出的\(q\)条限制\((a_j,h_j)\),使得\(C_{h_j}\)是第一个严格大于\(C_1\cdotsC_{a_j}\)的数。Solution我的方法叫......
  • CF1925D Good Trip 题解
    考虑分别计算\(p\)和\(q\)。按照期望的定义,\(q\)应该等于方案的总数,也就是\(s^k\),其中\(s\)表示一共有多少个不同的组。考虑如何求\(p\),我们先只计算第\(i\)组对\(p\)的贡献。如果第\(i\)组一共被选了\(1\)次,那么贡献为:\[g=f_i\timesC_{k}^{1}\times(s-1)^{......
  • P5208 [WC2019] I 君的商店 题解
    第一道黑题,发个题解。很好玩的一道交互题。题意有一个长为\(n\)的01字符串,保证至少有一个1,且已知1的数量的奇偶性。每次可以询问两个下标集合,返回哪个下标集合中1的个数更多(相同则可能返回其中任意的一个)。求该字符串,查询次数有限。题解我们约定a,b,c等......
  • 洛谷题解-[ABC286E] Souvenir
    https://www.luogu.com.cn/problem/AT_abc286_e题目描述NNN個の都市があり、いくつかの相異なる都市の間は一方通行の直行便によって移動することができます。どの直行便が存在するかはNNN個の長さNNNの文字列S1,S2,…,SNS_1,S_2,\ldots,S_NS1​,S2​,…,SN​......
  • P5208 [WC2019] I 君的商店 题解
    第一道黑题,发个题解。很好玩的一道交互题。题意有一个长为\(n\)的01字符串,保证至少有一个1,且已知1的数量的奇偶性。每次可以询问两个下标集合,返回哪个下标集合中1的个数更多(相同则可能返回其中任意的一个)。求该字符串,查询次数有限。题解我们约定a,b,c等......
  • 题解 [ABC338D] Island Tour
    【洛谷博客】被降智的一道简单题。题意\(n\)个岛屿,第\(i\)座桥连接\(i\)和\(i+1\)(第\(N\)座桥连接着\(1\)和\(N\))。有一条长度为\(M\)的旅游序列\(X\),你需要按照顺序依次经过这些点,选择断掉一座桥使得旅游经过的桥最少。分析设断掉第\(i\)座桥会因为绕行增......
  • P10114 [LMXOI Round 1] Size 题解
    题目链接:[LMXOIRound1]Size挺有意思的诈骗题,其实这类题都喜欢批一个外壳,例如数据范围提示之类的。记得以前遇到的很多诈骗题,有一道cf的高分题,问的是区间出现次数的次数\(mex\),这玩意一开始感觉好难,出现次数还简单,还要考虑次数的次数,所以带修莫队的时候,一直没法确定怎么解决......
  • NOI 2017 蚯蚓排队 题解
    Meaning给定一些数字,对它们进行首尾相接和断开两种操作。对于每次询问,求对于每个数字,其后长度一定的数字串在给定数字串中出现的次数,并给出这些次数之积。Soultion对于每次首尾相接或断开的操作,如果直接对断点或合点两侧的整个数字串进行操作,时间复杂度不可接受。由于每次查询......