题解 | 计数
计数
https://www.nowcoder.com/practice/e91f8e9c0b1f4df69d5d0814e173266c
对于每一个连续0区间,我们都可以单独算出它们的种数,通过累乘每个区间的种数即可算出结果。
那么,如何计算每个区间的种数?
这需要两个数据,一个是满足该区间条件的数字个数w,一个是该区间0的个数h:
我们用隔板法,假设有i个隔板,就有i+1个数字要填,通过排列组合,算出隔板放置组合有多少种,不同数字组合有多少种,二者相乘,即可得到单个区间种数
最后在计算的时候注意边乘边取模就好啦!
import math
mod = 1000000007
n = int(input())
#初始化结果1,便于后面累乘
res = 1
# 初始化列表,在列表最前面加个1000,便于计算能填入的数字数量
lis = [1000] + list(map(int,input().split()))
w_h = []
#添加每个非零区间数据
l,r = 0,0
sta = True
for i,x in enumerate(lis):
if x != 0:
if sta:
l = i
else:
r = i
w_h.append([lis[l]-lis[r] + 1,r-l-1])
l = r; sta = True
else:
sta = False
if lis[-1] == 0:w_h.append([lis[l],n - l]) #补充遗漏
# 计算结果
for w,h in w_h:
cnt = 0 # 计算单个区间种数
for i in range(0,h):
cnt = (cnt + math.comb(h-1,i) * math.comb(w,i+1)%mod)%mod
if i + 1 == w:break
# 累乘计算最终结果
res = res * cnt % mod
print(res)
查看16道真题和解析