首页 > 其他分享 >CodeForces 1349F1 Slime and Sequences (Easy Version)

CodeForces 1349F1 Slime and Sequences (Easy Version)

时间:2022-12-30 18:36:23浏览次数:50  
标签:typedef res ll 1349F1 CodeForces long Slime maxn mod

洛谷传送门

CF 传送门

发现样例中所有数的和为 \(n!n\),于是猜想好的序列总数为 \(n!\)。

考虑将每一个排列 \(p\) 唯一对应一个好的序列 \(a\)。可以这么构造:在 \(p\) 中顺着填,先倒着列出 \(1\) 在 \(a\) 中所有出现位置,再到 \(2,3,...,n\)。

于是发现对于一个排列 \(p\),\(i\) 出现的次数就是第 \(i\) 个连续极长的大于段的长度。所以当且仅当 \([1,j)\) 中有 \(i-1\) 个位置 \(k\) 满足 \(p_k < p_{k+1}\),\(j\) 就对 \(ans_i\) 造成了 \(1\) 的贡献。

设 \(f_{i,j}\) 有多少种 \(1 \sim i\) 的排列满足存在 \(j\) 个位置 \(p\) 满足 \(p_k < p_{k+1}\),可得:

\[ans_i = \sum\limits_{j=1}^n f_{j,i-1} \times \dbinom{n}{j} \times (n-j)! \]

意思是从 \(n\) 个数选 \(j\) 个,剩下 \(n-j\) 个数随便放。

\(f_{i,j}\) 可以 dp 求出。考虑将 \(i\) 插入 \(1 \sim i-1\) 的排列中,需要分类讨论:

  • 若插到开头,则从 \(f_{i-1,j}\) 转移;
  • 若插到结尾,则从 \(f_{i-1,j-1}\) 转移;
  • 若插到满足 \(p_k < p_{k+1}\) 的 \(k,k+1\) 之间,则从 \(j \times f_{i-1,j}\) 转移;
  • 若插到满足 \(p_k > p_{k+1}\) 的 \(k,k+1\) 之间,则从 \((i-j-1) \times f_{i-1,j-1}\) 转移。

综上,有 \(f_{i,j} = (j+1)f_{i-1,j} + (i-j)f_{i-1,j-1}\)。

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

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

#include <bits/stdc++.h>
#define pb push_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 = 5010;
const ll mod = 998244353;

ll n, fac[maxn], ifac[maxn];
ll f[maxn][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", &n);
	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[1][0] = 1;
	for (int i = 2; i <= n; ++i) {
		for (int j = 0; j < i; ++j) {
			f[i][j] = f[i - 1][j] * (j + 1) % mod;
			if (j) {
				f[i][j] = (f[i][j] + f[i - 1][j - 1] * (i - j) % mod) % mod;
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		ll ans = 0;
		for (int j = 1; j <= n; ++j) {
			ans = (ans + f[j][i - 1] * C(n, j) % mod * fac[n - j] % mod) % mod;
		}
		printf("%lld ", ans);
	}
}

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

标签:typedef,res,ll,1349F1,CodeForces,long,Slime,maxn,mod
From: https://www.cnblogs.com/zltzlt-blog/p/17015597.html

相关文章

  • Codeforces 891 A. Pride 做题记录(DP)
    原题链接:https://codeforces.com/problemset/problem/891/A一个比较显然的性质是如果序列的总$gcd$不为$1$,那么肯定是不存在解的。因为不管怎么样,都有一个因子无......
  • Codeforces Round #838 (Div. 2) A-B,补C,D
    A.DivideandConquer题意:给定n个数,每次操作可以使得:$$\lfloor\frac{ai}{2}\rfloor$$,求最少的操作次数使得n个数的总和为偶数。分析:和为偶数,res=0和为奇数,暴力......
  • Codeforces 1253 C. Sweets Eating 做题记录(DP)
    很明显,贪心策略是先吃甜度大的可以保证最终的总甜度最小,因此我们先从小到大排个序。一天可以吃$m$个,因此我们对于每个$k$,就让甜度前$1~m$名在第一天吃,前$m+1~2m$名第二......
  • [Codeforces Round #841]
    [CodeforcesRound#841]CodeforcesRound#841(Div.2)andDividebyZero2022A.JoeyTakesMoneyJoeyTakesMoneProblem:给一个正整数序列\(a_1,a_2,…,a_n(n......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #690 (Div. 3) E1. Close Tuples (easy version) (贪心+思维)
    https://codeforces.com/contest/1462/problem/E1E1.CloseTuples(easyversion)题目大意:给定一个长度为n的序列a,由1到n的整数组成,某些元素可能相等。找出m=3个元......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #766 (Div. 2)C,D
    CodeforcesRound#766(Div.2)C,D今天A竟然看错了,还好后来发现了,A题就写了40几分钟,真有你的过了B,排名是8千多,比前几天好一点,加油ヾ(◍°∇°◍)ノ゙CC相比于D,我更没有......
  • Codeforces Round #764 E
    E.Masha-forgetful题链结论就是任何长的串都可以被2,3长度的串表示后面就是暴力hash和很常规的dp[i]表示前i个是否匹配了voidsolve(){intn,m;cin>>n>>m;tu......
  • CodeForces 1163D Mysterious Code
    洛谷传送门CF传送门zxx的题单来的(发一个无脑kmp自动机+dp做法。看到题就很dp,考虑设计状态。显然填字母时要知道当前串与\(s,t\)的匹配位数,否则就不知道\(s,......