P4609 建筑师 Sol

首先显然可以确定一个最高的建筑,以此为中心,分成左半和右半。
同时可以认为,左半分为了 A1 个段,右半为 B1
然后可以将一个可以被看见的建筑理解为一个以其为开头的段。
那么这一段中以其为开头,其余的可以随便排序。
计算答案发现,假设某一段长度为 x,则排列方案数为 Px1x1
而一个大小为 x 的环,排列方案数也恰好为 Pxxx=Px1x1

则可以理解为将 n1 个元素分为 A+B2 个环。

那么答案就是这样,左边右边分一下,一个组合数,然后分一下环,乘起来。

答案即为 S1(n1,A+B1)×(A+B2A1)

res 表示第一类斯特林数,c 表示组合数。

inline void init() {
  res[0][0] = 1;
  for (int j = 1; j <= 5e4; ++j)
    for (int i = 1; i <= 2e2; ++i)
      res[j][i] = (res[j-1][i-1] + (j - 1) * res[j-1][i]) % p;
  for (int i = 0; i <= 2e2; ++i) c[0][i] = 1;
  for (int i = 1; i <= 2e2; ++i)
    for (int j = 1; j <= 2e2; ++j)
      c[i][j] = (c[i-1][j-1] + c[i][j-1]) % p;
}

inline void query() {
  cin >> n >> a >> b;
  int ans = res[n-1][a+b-2] * c[a-1][a+b-2];
  cout << ans % p << endl;
}
posted @   MistZero  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示