ABC235G
首先有一个 O(N2) 做法。
考虑容斥掉条件一,令 g(i) 表示恰好有 i 个花园空着的方案数,f(i) 表示钦定有 i 个花园空着,剩下无限制的方案数。
则有 g(0)=N∑i=0(−1)if(i)。
而
f(i)=(Ni)min(A,N−i)∑a=0(N−ia)×min(B,N−i)∑b=0(N−ib)×min(C,N−i)∑c=0(N−ic)
因此
g(0)=(−1)i(Ni)min(A,N−i)∑a=0(N−ia)×min(B,N−i)∑b=0(N−ib)×min(C,N−i)∑c=0(N−ic)
直接做是 O(n2) 的,Code。
考虑写的好看一点,变成:
(−1)N−i(Ni)min(A,i)∑a=0(ia)×min(B,i)∑b=0(ib)×min(C,i)∑c=0(ic)
先把这个式子放一放,令
fM(N)=min(N,M)∑i=0(Ni)
初值为 fM(0)=1。
则可以 O(1) 计算出
fM(N+1)=min(N+1,M)∑i=0(N+1i)
当 N+1≤M 时,则有
fM(N+1)=N+1∑i=0(N+1i)=2N+1
所以
fM(N+1)=2×fM(N)
那么如果 N+1>M 时呢?
考虑放在一张网格图上,借用一下官方题解的图:
考虑两者之间的联系,一个是走 N 步走到一个红色点的方案数,一个是走 N+1 步走到一个蓝色点的方案数。
发现从任意一个红色点,向上和向右都能走到一个蓝色点,除了最下面的点,它只能向上走到一个蓝色点,不难发现走到这个点的方案数就是 (NM)。
所以
fM(N+1)=2×fM(N)−(NM)
但是你发现 N<M 即 N+1≤M 的时候,(NM)=0,所以其实两者的式子是一样的。
由此,可以在 O(1) 内由
min(A,i)∑a=0(ia),min(B,i)∑b=0(ib),min(C,i)∑c=0(ic)
推出
min(A,i+1)∑a=0(i+1a),min(B,i+1)∑b=0(i+1b),min(C,i+1)∑c=0(i+1c)
于是总时间复杂度 O(N)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话