hdu3037 大组合数取模(Lucas定理)

该博客介绍了如何利用Lucas定理求解大组合数取模的问题,特别是当模数p为素数时。通过将组合数转化为阶乘的形式,并结合费马小定理进行优化,可以高效地计算C(n+m,m) % p。Lucas定理通过递归处理每个段的阶乘,处理数据规模可达p在10^5左右。" 80002363,7364645,HttpClient接口开发实践:JSON传输详解,"['接口开发', 'HTTP', 'JSON', '安全通信']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目相当于求n个数的和不超过m的方案数。

如果和恰好等于m,那么就等价于方程x1+x2+...+xn = m的解的个数,利用插板法可以得到方案数为:

(m+1)*(m+2)...(m+n-1)  = C(m+n-1,n-1) = C(m+n-1,m)

现在就需要求不大于m的,相当于对i = 0,1...,m对C(n+i-1,i)求和,根据公式C(n,k) = C(n-1,k)+C(n-1,k-1)得

C(n-1,0)+C(n,1)+...+C(n+m-1,m)

= C(n,0)+C(n,1)+C(n+1,2)+...+C(n+m-1,m)

= C(n+m,m)

现在就是要求C(n+m,m) % p,其中p是素数。

然后利用Lucas定理的模板就可以轻松的求得C(n+m,m) % p的值


下面简单介绍一下Lucas定理:

Lucas定理是用来求 C(n,m) mod p的值,p是素数(从n取m组合,模上p)。
描述为:
Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p)
Lucas(x,0,p)=1;

简单的理解就是:

以求解n! % p 为例,把n分段,每p个一段,每一段求得结果是一样的。但是需要单独处理每一段的末尾p,2p,...,把p提取出来,会发现剩下的数正好又是(n/p)! ,相当于

划归了一个子问题,这样递归求解即可。

这个是单独处理n࿰

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值