当前位置: 首页 > news >正文

题解:AT_abc458_e [ABC458E] Count 123

题目传送门

AtCoder

题目大意

\(X_1\)\(1\)\(X_2\)\(2\)\(X_3\)\(3\) 组成一个序列,要求相邻两个数 \(a_i\)\(a_{i+1}\) 的绝对值之差 \(|a_{i+1}-a_i| \leq 1\)

思路

分析条件

注意到 \(|a_{i+1}-a_i| \leq 1\) 意味着:

  • \(1\)\(2\) 可以相邻(因为 \(|1-2|=1\)
  • \(2\)\(3\) 可以相邻(因为 \(|2-3|=1\)
  • \(1\)\(3\) 不能相邻(因为 \(|1-3|=2\)

因此,构造出的序列中相邻的 \(1\)\(3\) 之间必须用 \(2\) 隔开。


所以,我们可以把 \(2\) 当作隔板,把 \(X_2\)\(2\) 排成一排如下:

\(\_,2,\_,2,\_,\dots,\_2,\_,2,\_\)

\(X_2\)\(2\) 总共形成了 \(X_2+1\) 个空隙,每个空隙都可以放若干个 \(1\) 或若干个 \(3\),但是 \(1\)\(3\) 不能出现在同一个空隙中。

组合计数

考虑组合计数

\(s=X_2+1\),表示空隙总数。

枚举 \(i\) 满足 \(1 \leq i \leq \min(X_1,s)\)\(j\) 满足 \(1 \leq j \leq \min(X_3,s-i)\)

接下来可以分四步计算。

1.选空隙

\(s\) 个空隙中选择 \(i\) 个放 \(1\),剩余 \(s-i\) 个中选 \(j\) 个放 \(3\)

\[\binom{s}{i} \cdot \binom{s-i}{j} \]

2.分配 \(1\)

隔板法

\(X_1\)\(1\) 放入 \(i\) 个非空盒子:

\[\binom{X_1-1}{i-1} \]

3.分配 \(3\)

\(X_3\)\(3\) 放入 \(j\) 个非空盒子:

\[\binom{X_3-1}{j-1} \]

4.求总方案数

总方案数即:

\[\sum_{i=1}^{\min(X_1,s)} \sum_{j=1}^{\min(X_3,s-i)} \binom{s}{i} \binom{s-i}{j} \binom{X_1-1}{i-1} \binom{X_3-1}{j-1} \]

优化

上述公式显然超时,考虑优化掉内层循环。

定义:

\[g[r] = \sum_{j=1}^{\min(X_3,\, r)} \binom{r}{j} \cdot \binom{X_3 - 1}{j - 1} \]

其中 \(r\) 为可用的空隙数量(\(r=X_2+1-i=s-i\)

含义:有 \(r\) 个空隙,把 \(X_3\)\(3\) 放入其中(可不放一些空隙)的方案数。

则:

\[\sum_{i=1}^{\min(X_1,s)} \sum_{j=1}^{\min(X_3,s-i)} \binom{s}{i} \binom{s-i}{j} \binom{X_1-1}{i-1} \binom{X_3-1}{j-1}=\sum_{i=1}^{\min(X_1,s)} \sum_{j=1}^{\min(X_3,s-i)} \binom{s}{i} \binom{X_1-1}{i-1} \cdot g[r] \]

\(t=j-1\)

\[g[r]=\sum_{t=0}^{\min(X_3-1, r-1)} \binom{r}{t+1} \binom{X_3-1}{t} \]

由于 \(\binom{r}{t+1} = \binom{r}{r-1-t}\),所以:

\[g[r]=\sum_{t} \binom{r}{r-1-t} \binom{X_3-1}{t} \]

考虑使用范德蒙德卷积:

\[\sum_{i=0}^k \binom{n}{i} \binom{m}{k-i}=\binom{n+m}{k} \]

此处:

  • \(n=r\)
  • \(m=X_3-1\)
  • \(k=r-1\)

所以:

\[g[r]=\binom{r+X_3-1}{r-1} \]

总方案数:

\[\sum_{i=1}^{\min(X_1,s)} \binom{s}{i} \binom{X_1-1}{i-1} \binom{r+X_3-1}{r-1} \]

所以,在线性时间复杂度内就可求出答案。


特殊情况

  • \(X_3=0\),则内层的贡献必然始终为 \(1\)。每次加上 \(\sum_{i=1}^{\min(X_1,s)} \binom{s}{i} \binom{X_1-1}{i-1}\) 即可。
  • \(X_1=0\),与 \(X_3=0\) 同理。
  • \(r=0\)(即 \(i=s\)
    • \(X_3=0\),则 \(g[0]=1\)
    • \(X_3 \neq 0\),则 \(g[0]=0\)

代码

AC Code
#include <iostream>
#define int long long
using namespace std;
const int p=998244353;
int ksm(int a,int b,int MOD)
{int res=1;while(b){if(b&1){res=(res*a)%MOD;}a=(a*a)%MOD;b>>=1;}return res;
}
int f[2000005],fn[2000005],x1,x2,x3,ans,x,g,s;
int c(int n,int m)
{if(m<0||m>n){return 0;}return f[n]*fn[m]%p*fn[n-m]%p;
}
signed main()
{f[0]=1;for(int i=1;i<=2000000;i++){f[i]=f[i-1]*i%p;}fn[2000000]=ksm(f[2000000],p-2,p);for(int i=1999999;i>=0;i--){fn[i]=fn[i+1]*(i+1)%p;}cin >> x1 >> x2 >> x3;s=x2+1;for(int i=1;i<=min(x1,s);i++){x=s-i;if(x<0)break;x=c(s,i)*c(x1-1,i-1)%p;if(x3==0){ans=(ans+x)%p;}else{if(s-i==0){g=(x3==0?1:0);}else{g=c(s-i+x3-1,s-i-1);}ans=(ans+x*g)%p;}}cout << ans;return 0;
}
http://www.jsqmd.com/news/830916/

相关文章:

  • 如何快速掌握EVE Online舰船配置:3个实用技巧与Pyfa工具完整指南
  • Koikatsu Sunshine增强补丁:5步打造完美游戏体验的终极指南
  • Bili2text完整指南:免费开源B站视频转文字神器,3步提升学习效率10倍!
  • 告别混乱工程!用STM32CubeIDE管理Inc和Src文件夹的正确姿势
  • 【HSPICE仿真进阶】.measure语句实战:从基础测量到自动化结果提取
  • 基于龙芯2K3000的国产工控机在数据中心动环监控中的实践
  • 【物联网无线通信技术】DW1000实战:从芯片到厘米级UWB定位系统构建
  • 在STM32F103上用FreeRTOS模拟I2C,为什么我劝你放弃硬件I2C?
  • 书成紫微动,律定凤凰驯:《第一大道》破的是资本,《凰标》立的是民心
  • OpenWrt UCI配置系统:核心机制、集成开发与实战指南
  • 为Claude Code配置Taotoken密钥与聚合地址的完整步骤
  • NGA论坛浏览体验革命:5个实用技巧让你的摸鱼效率提升300%
  • Mac玩转老游戏:手把手教你用Wineskin配置RPG Maker游戏所需RTP环境
  • 从ERR_CERT_COMMON_NAME_INVALID到安全连接:证书主题与域名匹配的实战指南
  • Cangaroo:开源CAN总线分析软件的完整使用指南与实战技巧
  • Linux Cgroup 原理与实践:从资源隔离到系统稳定
  • Linux/macOS下快速解密BitLocker加密盘的3种完整方法
  • Linux程序崩溃调试:Core Dump生成与GDB分析实战指南
  • Python信号重采样实战:从scipy.signal.resample到resample_poly的深度解析
  • Perl 环境安装指南
  • Python自动化办公:pdf2docx库实现高质量PDF转Word文档
  • Cursor Pro破解教程:3步实现AI编程助手永久免费使用完整指南
  • 【Multisim 14.0】从零到一:信号发生器与示波器实战指南——方波、三角波、正弦波的生成与测量
  • 别再花钱买1Password了!手把手教你用Docker和Vaultwarden搭建家庭私有密码库(附Nginx反代配置)
  • UE5《Electric Dreams》项目PCG技术解析 之 基于PCGSettings的模块化关卡构建
  • PEK-880模块驱动单相全桥逆变器:从电路原理到500W正弦波逆变实战
  • 2026最权威的十大降重复率平台推荐榜单
  • X承诺保护英国用户免受非法内容侵害,未达承诺或面临Ofcom罚款
  • FPGA开发入门:从零开始用Vivado实现LED流水灯项目
  • 别再傻傻分不清了!嵌入式开发中UART、RS232、RS485到底该怎么选?