Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)

yyb大佬的博客

这线段期望好神啊。。。

还有O(nlogn)FFTO(nlogn)FFT的做法 Freopen大佬的博客

本蒟蒻只会O(n2)O(n^2)

CODE

#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
typedef long long LL;
const int MAXN = 4005;
inline void add(int &x, int y) { x += y; if(x >= mod) x -= mod; }
inline int qpow(int a, int b) {
	int res = 1;
	while(b) {
		if(b & 1) res = 1ll * res * a % mod;
		a = 1ll * a * a % mod; b >>= 1;
	}
	return res;
}
int n, l, k, f[2][MAXN][2];
int main () {
	scanf("%d%d%d", &n, &k, &l);
	int now = 0, N = 2*n+1;
	f[0][0][0] = 1;
	for(int i = 1; i <= N; ++i) {
		now ^= 1; memset(f[now], 0, sizeof f[now]);
		for(int j = 0; j < i; ++j) {
			add(f[now][j+1][0], f[now^1][j][0]),
			add(f[now][j+1][1], f[now^1][j][1]);
			if(j)
			add(f[now][j-1][0], 1ll * f[now^1][j][0] * j % mod),
			add(f[now][j-1][1], 1ll * f[now^1][j][1] * j % mod);
			if(j >= k)
			add(f[now][j][1], f[now^1][j][0]);
		}
	}
	int ans = 1ll * f[now][0][1] * l % mod * qpow(2, n) % mod;
	for(int i = n+1; i <= N; ++i) ans = 1ll * ans * qpow(i, mod-2) % mod;
	printf("%d\n", (ans + mod) % mod);
}
posted @ 2019-12-14 14:50  _Ark  阅读(257)  评论(0编辑  收藏  举报