[ARC124F] Chance Meeting 题解
容斥,容斥,容斥。
思路#
考虑设
发现答案为:
考虑走到
但是这样有可能在前面就相遇了。
我们可以发现,相遇只会在一行发生,所以可以容斥。
有:
套路地,令
有:
那么答案为:
分治 ntt 处理即可。
时间复杂度:
Code#
#include <bits/stdc++.h>
#include "atcoder/convolution"
using namespace std;
const int mod = 998244353;
int n, m;
int f[600010];
int v[600010];
int g[200010];
int h[200010];
inline int power(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = 1ll * res * x % mod;
x = 1ll * x * x % mod, y >>= 1;
}
return res;
}
inline void init(int n) {
f[0] = 1;
for (int i = 1; i <= n; i++) f[i] = 1ll * i * f[i - 1] % mod;
v[n] = power(f[n], mod - 2);
for (int i = n; i >= 1; i--) v[i - 1] = 1ll * i * v[i] % mod;
}
inline void del(int&x, int y) {
x = x - y;
if (x < 0) x += mod;
}
inline void sol(int L, int R, int l, int r) {
vector<int> a, b;
int e = R - l;
for (int i = l; i <= r; i++) a.push_back(g[i]);
for (int i = 0; i <= e; i++) b.push_back(h[i]);
a = atcoder::convolution(a, b);
for (int i = L; i <= R; i++) {
del(g[i], a[e - R + i]);
}
}
inline void cdq(int l, int r) {
if (l < r) {
int mid = (l + r) >> 1;
cdq(l, mid);
sol(mid + 1, r, l, mid);
cdq(mid + 1, r);
}
}
int main() {
cin >> n >> m;
init(n + m + m);
for (int i = 1; i <= m; i++) {
g[i] = 1ll * f[n + i + i - 3] * v[i - 1] % mod * v[i - 1] % mod;
h[i] = 1ll * f[i + i] * v[i] % mod * v[i] % mod;
}
cdq(1, m);
int ans1 = 0;
int ans2 = 0;
for (int i = 1; i <= m; i++)
ans1 = (ans1 + 1ll * g[i] * g[m - i + 1]) % mod;
for (int i = 1; i <= n; i++)
ans2 = (ans2 + 1ll * v[i - 1] * v[n - i] % mod * v[i - 1] % mod * v[n - i]) % mod;
cout << 1ll * ans1 * ans2 % mod << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)