首页 > 其他分享 >AtCoder Beginner Contest 235 G Gardens

AtCoder Beginner Contest 235 G Gardens

时间:2023-02-04 09:11:36浏览次数:53  
标签:AtCoder ll limits sum maxn 235 binom Gardens mod

洛谷传送门

考虑不要求每个盒子至少放一个球,答案即为 \(\sum\limits_{i=0}^A \binom{n}{i} \times \sum\limits_{i=0}^B \binom{n}{i} \times \sum\limits_{i=0}^C \binom{n}{i}\)。

加上这个条件,考虑容斥,钦定 \(i\) 个盒子不能放球,其他随意,则答案为 \(\sum\limits_{i=0}^n (-1)^i \binom{n}{i} \sum\limits_{j=0}^A \binom{n-i}{j} \times \sum\limits_{j=0}^B \binom{n-i}{j} \times \sum\limits_{j=0}^C \binom{n-i}{j}\)。

似乎没有快速算 \(\sum\limits_{i=0}^m \binom{n}{i}\) 的方法,但是观察发现式子中 \(m\) 不变,\(n\) 每次减一,考虑递推。设 \(f_i = \sum\limits_{j=0}^A \binom{i}{j}\),则根据 \(\binom{n}{m} = \binom{n-1}{m} + \binom{n-1}{m-1}\),可得 \(f_i = \frac{f_{i+1} + \binom{i}{A}}{2}\)。按照相同的方法递推出 \(g_i = \sum\limits_{j=0}^B \binom{i}{j}\) 和 \(h_i = \sum\limits_{j=0}^C \binom{i}{j}\),答案即为 \(\sum\limits_{i=0}^n (-1)^i \binom{n}{i} f_{n-i} g_{n-i} h_{n-i}\)。

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

#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 long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 10000100;
const int N = 10000000;
const ll mod = 998244353;
const ll inv2 = (mod + 1) / 2;

ll n, X, Y, Z, fac[maxn], ifac[maxn], f[maxn], g[maxn], h[maxn];

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;
}

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;
	}
}

void solve() {
	scanf("%lld%lld%lld%lld", &n, &X, &Y, &Z);
	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;
	}
	for (int i = 0; i <= X; ++i) {
		f[n] = (f[n] + C(n, i)) % mod;
	}
	for (int i = n - 1; ~i; --i) {
		f[i] = (f[i + 1] + C(i, X)) % mod * inv2 % mod;
	}
	for (int i = 0; i <= Y; ++i) {
		g[n] = (g[n] + C(n, i)) % mod;
	}
	for (int i = n - 1; ~i; --i) {
		g[i] = (g[i + 1] + C(i, Y)) % mod * inv2 % mod;
	}
	for (int i = 0; i <= Z; ++i) {
		h[n] = (h[n] + C(n, i)) % mod;
	}
	for (int i = n - 1; ~i; --i) {
		h[i] = (h[i + 1] + C(i, Z)) % mod * inv2 % mod;
	}
	ll ans = 0;
	for (int i = 0; i <= n; ++i) {
		ans = (ans + ((i & 1) ? mod - 1 : 1) * C(n, i) % mod * f[n - i] % mod * g[n - i] % mod * h[n - i] % mod) % mod;
	}
	printf("%lld\n", ans);
}

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

[AtCoder 传送门](https://atcoder.jp/contests/abc235/tasks/abc235_g "AtCoder 传送门")

标签:AtCoder,ll,limits,sum,maxn,235,binom,Gardens,mod
From: https://www.cnblogs.com/zltzlt-blog/p/17090849.html

相关文章

  • 【DFS】LeetCode 235. 二叉搜索树的最近公共祖先
    题目链接235.二叉搜索树的最近公共祖先思路与【DFS】LeetCode236.二叉树的最近公共祖先一模一样代码classSolution{publicTreeNodelowestCommonAncesto......
  • AtCoder Beginner Contest 168 C - : (Colon)
    题意:时针转过的角度:​分针转过的角度:。AC代码:constintN=1e6+50;constdoublepi=acos(-1.0);intmain(){doublea,b,h,m;cin>>a>>b>>h>>m;lon......
  • AtCoder Beginner Contest 168 D - .. (Double Dots)
    题意:有个房间,在这些房间中两两连次条边,问除了第一个房间,其他房间走到第一个房间的最短路径,输出这个房间所连的上一个房间,如果走不到,输出.AC代码;constintN=......
  • [ABC266] AtCoder Beginner Contest 266
    比赛链接:Tasks-AtCoderBeginnerContest266先贴代码,题解有空再补。TasksTaskNameTimeLimitMemoryLimitAMiddleLetter2sec1024MBSubmit......
  • Atcoder ABC282F Union of Two Sets
    https://atcoder.jp/contests/abc282/tasks/abc282_fST表板子???这怎么出的?发现要每一个区间都能拆分成至多两个区间,那很明显就能联想到ST表的查询。大概算一下发现......
  • Atcoder ABC282E Choose Two and Eat One
    https://atcoder.jp/contests/abc282/tasks/abc282_e发现选出两个球去掉一个球其实很像一颗树去掉叶子节点,贡献即为叶子节点与父亲的边权。那这题就很明显了,预处理好每......
  • Atcoder ABC282H Min + Sum
    https://atcoder.jp/contests/abc282/tasks/abc282_h挂了好久发现二分写挂了……对于\(\min\{a_i\}\)这一部分,不难想到找到当前\(\min\{a_i\}\)的位置计算其左右两......
  • AtCoder Beginner Contest 287
    FComponents考虑树形\(DP\)。有\(f_{i,j,0/1}\)为以\(i\)为根的子树,一共有\(j\)个连通块,选/不选的方案数。\[pre_{x,0/1}\leftarrowf_{u,x,0/1}\]\[f_......
  • 2235
    给你两个整数 num1 和 num2,返回这两个整数的和。 输入:num1=12,num2=5输出:17解释:num1是12,num2是5,它们的和是12+5=17,因此返回17。classSolutio......
  • 2351
    给你一个由小写英文字母组成的字符串 s ,请你找出并返回第一个出现 两次 的字母。注意:如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前,则......