[ARC124F] Chance Meeting 题解

容斥,容斥,容斥。

思路#

考虑设 fi,j 为第一次在 i,j 相遇的方案数。

发现答案为:

ans=i=1nj=1mfi,jfni+1,mj+1

考虑走到 (i,j) 并相遇的方案数:

(n+j+j3i1,j1,ni,j1)

但是这样有可能在前面就相遇了。

我们可以发现,相遇只会在一行发生,所以可以容斥。

有:

(1)fi,j=(n+j+j3i1,j1,ni,j1)k<jfi,k(2×j2×kjk)(2)=(n+j+j3)!(i1)!(j1)!(ni)!(j1)!k<jfi,k(j+jkk)!(jk)!(jk)!

套路地,令 fi,j=gj(i1)!(ni)!

有:

(3)gj=(n+j+j3)!(j1)!(j1)!k<jgk(j+jkk)!(jk)!(jk)!

那么答案为:

(4)ans=i=1nj=1mfi,jfni+1,mj+1(5)=i=1n1(i1)!(ni)!(ni)!(i1)!j=1mgjgmj+1

分治 ntt 处理即可。

时间复杂度:O(nlog2n)

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

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18457279

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示