1359. 有效的快递序列数目

132 阅读1分钟

题目:
给你 n 笔订单,每笔订单都需要快递服务。

请你统计所有有效的 收件/配送 序列的数目,确保第 i 个物品的配送服务 delivery(i) 总是在其收件服务 pickup(i) 之后。

由于答案可能很大,请返回答案对 10^9 + 7 取余的结果。
算法:
方法一:数学。
假设n的序列数为P(n), 对于序列:P1,P2,D1,D2,新增一个快递3,可以选择
1.P3,D3连续放在一起,2(n) + 1个区间,选一个放,共有C2n+11C_{2n+1}^1种情况。 2.P3,D3不连续放在一起,共有C2n+12C_{2n+1}^2种情况(选两个格子出来,我总是把P放在D前面)。
n+1序列数总共P(n + 1) = P(n) * (C2n+11C_{2n+1}^1 + C2n+12C_{2n+1}^2)。根据递推公式求结果即得到答案。

func countOrders(n int) int {
    ans := 1
    mod := 1000000007
    for i := 2; i <= n ; i ++ {
        a := 2 * i - 1
        b := a * (a - 1) / 2 + a
        ans = (ans * b) % mod
    
    }
    return ans
}