首页 > 其他分享 >AtCoder Beginner Contest 253 Ex We Love Forest

AtCoder Beginner Contest 253 Ex We Love Forest

时间:2023-06-16 17:33:57浏览次数:50  
标签:AtCoder typedef Love Beginner Contest long times setminus define

洛谷传送门

AtCoder 传送门

没做出来。

考虑求出方案数后除以 \(m^i\) 求出概率。

设 \(U = \{1, 2, ..., n\}\)。

因为题目限制了加几条边,不妨设 \(f_{i, S}\) 为,加了 \(i\) 条边,\(S\) 形成森林且 \(U \setminus S\) 没有边的方案数。

转移枚举子集 \(T\),钦定 \(T\) 为树,设 \(T\) 为树的方案数为 \(g_T\),那么 \(f_{i, S} = \sum\limits_{T \subseteq S \land T \neq \varnothing} f_{i - (|T| - 1), S \setminus T} \times g_T\)。

考虑求 \(g_S\)。枚举一条边断开即可。所以枚举 \(T \subset S\),那么 \(T\) 和 \(S \setminus T\) 都要是树,并且还可以加一条 \(T\) 和 \(S \setminus T\) 之间的边,为了避免算重除以 \(2 (|S| - 1)\)。所以 \(g_S = \frac{1}{2 (|S| - 1)} \times \sum\limits_{T \subset S} g_T \times g_{S \setminus T} \times F(T, S \setminus T)\),其中 \(F(T, S \setminus T)\) 为两个端点分别在 \(T, S \setminus T\) 中的边数。

\(F(T, S \setminus T)\) 可以容斥求。设 \(h_S\) 为 \(S\) 内部的边数,那么 \(F(T, S \setminus T) = h_S - h_T - h_{S \setminus T}\)。

因为这样求出来的 \(f_{i, U}\) 没有规定加边顺序,所以答案要乘上 \(i!\)。最后 \(i\) 的概率即为 \(\frac{f_{i, U} \times i!}{m^i}\)。

code
// Problem: Ex - We Love Forest
// Contest: AtCoder - NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)
// URL: https://atcoder.jp/contests/abc253/tasks/abc253_h
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define lowbit(x) ((x) & (-(x)))
#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 = 16;
const int maxm = (1 << 14) + 50;
const ll mod = 998244353;

ll n, m, f[maxn][maxm], g[maxm], h[maxm], inv[maxm], fac[maxm];
pii E[maxm];

void solve() {
	inv[1] = 1;
	for (int i = 2; i < maxm; ++i) {
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
	}
	fac[0] = 1;
	for (int i = 1; i < maxm; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= m; ++i) {
		scanf("%lld%lld", &E[i].fst, &E[i].scd);
		--E[i].fst;
		--E[i].scd;
		int u = E[i].fst, v = E[i].scd;
		for (int S = 1; S < (1 << n); ++S) {
			if ((S & (1 << u)) && (S & (1 << v))) {
				++h[S];
			}
		}
	}
	for (int i = 0; i < n; ++i) {
		g[1 << i] = 1;
	}
	for (int S = 1; S < (1 << n); ++S) {
		for (int T = (S - 1) & S; T; T = (T - 1) & S) {
			int U = S ^ T;
			g[S] = (g[S] + g[T] * g[U] % mod * (h[S] - h[T] - h[U] + mod + mod) % mod) % mod;
		}
		int cnt = __builtin_popcount(S);
		if (cnt > 1) {
			g[S] = g[S] * inv[2 * (cnt - 1)] % mod;
		}
	}
	for (int S = 0; S < (1 << n); ++S) {
		f[0][S] = 1;
	}
	ll pw = 1, P = inv[m];
	for (int i = 1; i < n; ++i) {
		for (int S = 1; S < (1 << n); ++S) {
			for (int T = S; T; T = (T - 1) & S) {
				int e = __builtin_popcount(T) - 1;
				if (i < e || ((~T) & lowbit(S))) {
					continue;
				}
				int U = S ^ T;
				f[i][S] = (f[i][S] + f[i - e][U] * g[T] % mod) % mod;
			}
		}
		pw = pw * P % mod;
		printf("%lld\n", f[i][(1 << n) - 1] * fac[i] % mod * pw % mod);
	}
}

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

标签:AtCoder,typedef,Love,Beginner,Contest,long,times,setminus,define
From: https://www.cnblogs.com/zltzlt-blog/p/17486117.html

相关文章

  • AtCoder Beginner Contest 298 Ex Sum of Min of Length
    洛谷传送门AtCoder传送门挺无脑的。是不是因为unr所以评分虚高啊/qd考虑把\(L_i\toR_i\)的路径拎出来,那么路径中点(或中边)左边的点挂的子树到\(L_i\)更优,右边的点挂的子树到\(R_i\)更优。差分一下,可以转化成\(O(q)\)次询问,每次询问形如\((u,v)\)表示求\(v\)......
  • AtCoder Beginner Contest 251 G Intersection of Polygons
    洛谷传送门AtCoder传送门经典结论,一个点\(P(x,y)\)在一个凸多边形内部\(S=\{(x_i,y_i)\}\)的充要条件是\(\foralli\in[1,n],(x_{i+1}-x_i,y_{i+1}-y_i)\times(x-x_i,y-y_i)\ge0\),其中\(S\)的点按照逆时针排列。然后我们运用叉积的一个性质......
  • AtCoder Beginner Contest 220 G Isosceles Trapezium
    洛谷传送门AtCoder传送门简单题。首先肯定是要枚举梯形其中一条底边的两个端点的。那么另一条底边除了斜率与这条边相等,两个端点的距离要分别与这条底边两个端点的距离相等。发现这个十分不好做,考虑一个梯形是等腰梯形的一个充要条件。不难想到,连接两底中点,这条线段垂直于两......
  • 形容女性漂亮的英文:beautiful、elegant、attractive、lovely、pretty
    形容女性漂亮的英文:beautiful、elegant、attractive、lovely、pretty。1、beautiful英[?bju:t?fl]美[?bjut?f?l]adj.美丽的,美好的;极好的;[例句]Shewasaverybeautifulwoman她是个大美女。2、elegant英[?el?g?nt]美[??l?ɡ?nt]adj.(人或其举止)优美的;漂亮的;简炼的;简洁的;[......
  • AtCoder Beginner Contest 249 G Xor Cards
    洛谷传送门AtCoder传送门好题。套路地,考虑枚举最优解的\(a\)异或和二进制下与\(k\)的\(\text{LCP}\),设在第\(i\)位不同。这样的好处是\(i\)之后的位可以随便选。之后按位贪心确定最优解\(b\)的异或和。考虑之前的答案是\(res\),当前在确定第\(j\)位,如何判断\(r......
  • AtCoder Beginner Contest 305 题解 A - F
    A-WaterStation题目大意找到离给定的数最近的一个\(5\)的倍数输出即可。解题思路我们取这个数对\(5\)的上下界,也就是整数除以\(5\)再乘以\(5\),以及这个数再加上一个\(5\),比较这两数和给定数的距离即可。ACCode#include<iostream>#include<algorithm>#includ......
  • AtCoder Beginner Contest 219 H Candles
    洛谷传送门AtCoder传送门套路化了。比较显然的关路灯型区间dp。考虑你\(t\)时刻熄灭一个初始长度为\(a\)的蜡烛,得分是\(\max(a-t,0)\),所以尝试把时间塞进状态。设\(f_{i,j,k,0/1}\)表示,熄灭完区间\([i,j]\)的蜡烛,当前时间是\(t\),在左端点还是右端点的最大得......
  • AtCoder Beginner Contest 223 H Xor Query
    洛谷传送门AtCoder传送门考虑一个无脑做法:线段树维护区间线性基。时间复杂度是\(O(m\logn\log^2V)\),过于优秀以至于无法接受。事实上我们并不需要维护区间线性基,因为不带修。考虑“可持久化线性基”,开\(n\)个线性基,第\(i\)个维护前缀\([1,i]\)的数。并且插入线性......
  • AtCoder Beginner Contest 215 H Cabbage Master
    洛谷传送门AtCoder传送门考虑第一问。发现这个东西长得很像二分图匹配,考虑建图,第\(i\)个盒子建\(b_i\)个左部点,第\(i\)个球建\(a_i\)个右部点,每个盒子的每个点往可以放的球的每个点连边。显然要求能被满足等价于,这个二分图存在一个左部点的完全匹配。因为一个盒子的......
  • AtCoder Regular Contest 141 C Bracket and Permutation
    洛谷传送门AtCoder传送门考虑给出\(S\),如何求\(P,Q\)。先考虑\(P\),那我们肯定想让\(P\)的每一项都尽量往前靠。设\([1,k]\)为合法括号串,\(S_{k+1}=\texttt{)}\),那\(P\)的前\(k\)项依次为\(1\simk\),第\(k+1\)项不能为\(k+1\)了,那找到\(k+1\)之......