题解 | 计数

计数

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)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务