1359 count-all-valid-pickup-and-delivery-options
题目
给你 n 笔订单,每笔订单都需要快递服务。
请你统计所有有效的 收件/配送 序列的数目,确保第 i 个物品的配送服务 delivery(i) 总是在其收件服务 pickup(i) 之后。
由于答案可能很大,请返回答案对 10^9 + 7 取余的结果。
思路
是一道排列组合题,找到递推关系即可。一直f(i-1),求f(i),则加入p(i)和d(i)
- p(i)和d(i)连续,则类似在f(i-1)的2(i-1)个数中插入1个数,有2(i-1)+1个位置
- p(i)和d(i)不连续,则是在f(i-1)的2(i-1)个数中插入2个数,组合数c( 2, 2(i-1) +1) = (2i-1)*(2i-2)/2 = (2i-1)(i-1)
将两种情况相加,f(i) = (2 * i - 1) * i * f(i - 1)
另外考虑将结果mod 1e9+7
class Solution {
public:
int countOrders(int n) {
long long ans = 1, mod = 1e9+7;
for(int i=2;i<=n;i++)
{
ans = ans*(2*i-1)*i%mod;
}
return ans;
}
};