首页 > 其他分享 >AtCoder Regular Contest 163 D Sum of SCC

AtCoder Regular Contest 163 D Sum of SCC

时间:2023-07-03 21:48:14浏览次数:54  
标签:AtCoder typedef Contest Sum long maxn ll mod

洛谷传送门

AtCoder 传送门

怎么连这种相对传统的计数也不会……

考虑换种方式描述强连通分量个数。考虑竞赛图缩点后存在一条极长的链,因此转化为把缩完点后的链劈成左右两个集合,使得左边集合不为空的方案数。

于是我们现在只要统计点集 \(A, B\) 数量,满足 \(A \ne \varnothing, A \cap B = \varnothing, A \cup B = [1, n]\) 且 \(A\) 中的边始终指向 \(B\)。

考虑 dp。设 \(f_{i, j, k}\) 为考虑了 \([1, i]\) 的点,\(|A| = j\),小连到大的边数为 \(k\) 的方案数。转移讨论 \(i + 1\) 分给 \(A\) 还是 \(B\) 即可,枚举对应集合中有多少 \(u \to i + 1\) 的点即可。

时间复杂度 \(O(n^5)\)。

code
// Problem: D - Sum of SCC
// Contest: AtCoder - AtCoder Regular Contest 163
// URL: https://atcoder.jp/contests/arc163/tasks/arc163_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 35;
const ll mod = 998244353;

inline ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

ll n, m, f[maxn][maxn][maxn * maxn], fac[maxn], ifac[maxn];

inline ll C(ll n, ll m) {
	if (n < m || n < 0 || m < 0) {
		return 0;
	} else {
		return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
	}
}

inline void upd(ll &x, ll y) {
	x += y;
	(x >= mod) && (x -= mod);
}

void solve() {
	scanf("%lld%lld", &n, &m);
	fac[0] = 1;
	for (int i = 1; i <= n; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	ifac[n] = qpow(fac[n], mod - 2);
	for (int i = n - 1; ~i; --i) {
		ifac[i] = ifac[i + 1] * (i + 1) % mod;
	}
	f[0][0][0] = 1;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j <= i; ++j) {
			for (int k = 0; k <= m; ++k) {
				if (!f[i][j][k]) {
					continue;
				}
				for (int l = 0; l <= j; ++l) {
					upd(f[i + 1][j + 1][k + l], f[i][j][k] * C(j, l) % mod);
				}
				for (int l = 0; l <= i - j; ++l) {
					upd(f[i + 1][j][k + j + l], f[i][j][k] * C(i - j, l) % mod);
				}
			}
		}
	}
	ll ans = 0;
	for (int i = 1; i <= n; ++i) {
		ans = (ans + f[n][i][m]) % mod;
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Contest,Sum,long,maxn,ll,mod
From: https://www.cnblogs.com/zltzlt-blog/p/17524161.html

相关文章

  • AtCoder Regular Contest 153 E Deque Minimization
    洛谷传送门AtCoder传送门我们考虑给定\(X\),如何贪心地求\(f(X)\)。队列为空时加入队首或队尾都是一样的。队列不为空,设队首为\(c\)。因为我们的目标是最小化字典序,于是如果\(X_i\lec\),我们把\(X_i\)加入队首,否则加入队尾。由此也容易发现,加入队首的数一定单调不升。......
  • AtCoder Beginner Contest 308 G Minimum Xor Pair Query
    洛谷传送门AtCoder传送门考虑没有删除操作怎么做。可以动态维护\(ans\),新加进来一个\(x\),我们计算\(\min\limits_{y\inS}x\oplusy\)。对\(S\)建01Trie,然后从高位往低位按位贪心,在01Trie上优先往与\(x\)这一位相同的方向走,但是前提是它的子树内有数,对于01Trie......
  • AtCoder ABC307D 题解
    AtCoderABC307DMismatchedParentheses题解思路分析First——配对括号序列首先,每个右括号肯定是要与其左边最近的左括号配对。因此,我们便可以使用一个栈来进行存放左括号的下标。当有右括号时,便可以弹出栈顶元素,但是栈为空时,便无法配对。拿样例1举个例子:8a(b(d))c......
  • AtCoder Beginner Contest 308 A~F
    AtCoderBeginnerContest308手速有点慢A-NewScheme判断给定数字是否满足条件voidsolve(){ boolok=true; inta[10]; for(inti=1;i<=8;i++) cin>>a[i]; for(inti=1;i<=8;i++) { if(i>=2&&a[i]<a[i-1]) ok=......
  • AtCoder Beginner Contest 308
    A:1#include<cstdio>2#include<cstring>3#include<algorithm>4#include<iostream>5#include<string>6#include<vector>7#include<stack>8#include<bitset>9#include<cstdlib>10#include......
  • 【atcoder beginner 308E - MEX】
    前缀和二分查找打表枚举代码如下importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.StreamTokenizer;importjava.util.ArrayList;importjava.util.List;publicclassMain{publicstaticIntege......
  • AtCoder Grand Contest 021 E Ball Eat Chameleons
    洛谷传送门AtCoder传送门容易发现一个变色龙是红色当且仅当,设\(R\)为红球数量,\(B\)为蓝球数量,那么\(R\geB\)或\(R=B\)且最后一个球是蓝球。考虑如何判定一个颜色序列是否可行。考虑贪心。若\(R<B\)显然不行。若\(R\geB+n\),每个变色龙都可以分到比蓝球......
  • 空和0造成的Sumifs的错误结果
    问题:某个条件区域为空,直接使用Sumifs的结果错误。解决:H2单元格连接空文本=SUMIFS(C:C,A:A,G2,B:B,H2&"")绝大多数情况下,空单元格被引用后返回的结果是0,但作为Sumif这类函数的条件区域参数,默认为非数值,即空文本,这时就可以将相应的条件转成文本型数字。这一转换不会影响条......
  • AtCoder Beginner Contest 307(E,F,G)
    AtCoderBeginnerContest307(E,F,G)E(dp)E这个题大意就是我们需要组成一个长度为\(n\)的数组,满足两个相邻的数字不可以相等,其中,\(a_1\)和\(a_n\)也是相邻的,我们可以选择的数字为\(0\)到\(m-1\),问最后有多少种不同的组成方式满足以上条件。题目大意很简单,就是有点难想,如果\(a......
  • 18、【SparkStreaming】object not serializable (class: org.apache.kafka.clients.c
    背景:当SparkStream连接kafka,消费数据时,报错:objectnotserializable(class:org.apache.kafka.clients.consumer.ConsumerRecord,value:ConsumerRecord分析:消费者的消费记录序列化出现了问题,需要正确的进行序列化。措施:在设置sparkconf的时候,指定序列化方式就可以解......