ABC235G

首先有一个 O(N2) 做法。

考虑容斥掉条件一,令 g(i) 表示恰好有 i 个花园空着的方案数,f(i) 表示钦定有 i 个花园空着,剩下无限制的方案数。

则有 g(0)=Ni=0(1)if(i)

f(i)=(Ni)min(A,Ni)a=0(Nia)×min(B,Ni)b=0(Nib)×min(C,Ni)c=0(Nic)

因此

g(0)=(1)i(Ni)min(A,Ni)a=0(Nia)×min(B,Ni)b=0(Nib)×min(C,Ni)c=0(Nic)

直接做是 O(n2) 的,Code

考虑写的好看一点,变成:

(1)Ni(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+1M 时,则有

fM(N+1)=N+1i=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<MN+1M 的时候,(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)

Code

posted @   Kobe303  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示