题解:CF2025E Card Game
貌似和大部分做法不太一样(?)
权当卡特兰数的复习题吧。不会卡特兰数的可以先看文末。
如果没有花色
发现除了花色
有转移:
枚举的
答案就是:
至此,已经解决大部分问题了,最后就是解决花色
复杂度为
#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e3 + 7, mod = 998244353;
int fc[maxN], ifc[maxN];
int ksm(int a, int b = mod - 2) {
int res = 1;
while (b) {
if (b & 1)
res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= 1;
}
return res;
}
int n, m;
int C(int n, int m) {
if (n < 0 || m < 0 || n < m) return 0;
return 1ll * fc[n] * ifc[m] % mod * ifc[n - m] % mod;
}
int H(int k) {
auto res = C(m, (m + k) / 2) - C(m, (m + k) / 2 + 1);
res += res < 0 ? mod : 0;
return res;
}
int f[507][507];
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
cin >> n >> m;
fc[0] = 1;
for (int i = 1; i <= m * 2; i++)
fc[i] = 1ll * fc[i - 1] * i % mod;
ifc[m * 2] = ksm(fc[m * 2]);
for (int i = m * 2 - 1; i >= 0; i--)
ifc[i] = 1ll * ifc[i + 1] * (i + 1) % mod;
f[1][0] = 1;
for (int i = 2; i <= n; i++)
for (int j = 0; j <= m; j++)
for (int k = (m & 1); k <= j; k += 2)
f[i][j] = (f[i][j] + 1ll * f[i - 1][j - k] * H(k) % mod) % mod;
int ans = 0;
for (int k = 0; k <= m; k++)
ans = (ans + 1ll * f[n][k] * H(k) % mod) % mod;
cout << ans << '\n';
}
卡特兰数可以解决这类问题:有一个大小为
答案就是所有的路径数减去不合法的路径数,发现不合法的路径一定经过直线
下图中的橙色虚线和粉色虚线是不合法的路径。
可以得出
所以:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探