题目大概问小于等于m个的物品放到n个地方有几种方法。

即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m。

这个方程的非负整数解个数是个经典问题,可以+1转化正整数解的个数用插板法解决:$C_{y+n-1}^{n-1}=C_{y+n-1}^y$。

而0<=y<=m,最后的结果就是——

$$\sum_{i=0}^m C_{i+n-1}^i$$

$$C_{n-1}^0+C_{n}^1+C_{n+1}^2+\dots+C_{n-1+m}^m$$

$$C_{n}^0+C_{n}^1+C_{n+1}^2+\dots+C_{n-1+m}^m$$

$$C_{n+1}^1+C_{n+1}^2+\dots+C_{n-1+m}^m\ \tag{$C_{n+1}^1=C_{n}^0+C_{n}^1$}$$

$$C_{n+2}^2+\dots+C_{n-1+m}^m\ \tag{$C_{n+2}^2=C_{n+1}^1+C_{n+1}^2$}$$

$$\vdots$$

$$C_{n+m}^m$$

于是就推算出结果是$C_{n+m}^m$。那么就是计算$C_{n+m}^m\ mod \ p$,其中1<=n,m<=1000000000,1<p<100000且p为质数。

这时就是用Lucas定理来计算这种大组合数的模:$Lucas(n,m)\equiv C_{n\%p}^{m\%p}\times Lucas(n/p,m/p)\pmod p$。

另外计算组合数时,利用模p下的乘法逆元,$C_n^m\equiv\frac {n!}{(n-m)!m!}\equiv n!\times((n-m)!m!)^{-1} \pmod p$

而计算逆元没必要用扩展欧几里得算法,因为p是质数,利用费马小定理可以推出n在模p下的乘法逆元为$n^{p-2}\ mod\ p$。

 #include<cstdio>
#include<cstring>
using namespace std;
long long ine(long long n,long long p){
long long res=,m=p-;
while(m){
if(m&) res=res*n%p;
n=n*n%p;
m>>=;
}
return res;
}
long long fact[]={};
long long lucas(long long n,long long m,long long p){
long long res=;
while(n&&m){
long long a=n%p,b=m%p;
if(a<b) return ;
res=res*fact[a]*ine(fact[b]*fact[a-b]%p,p)%p;
n/=p; m/=p;
}
return res;
}
int main(){
long long n,m,p;
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=; i<p; ++i) fact[i]=fact[i-]*i%p;
printf("%lld\n",lucas(n+m,m,p));
}
return ;
}

HDU3037 Saving Beans(Lucas定理+乘法逆元)的更多相关文章

  1. Hdu 3037 Saving Beans(Lucus定理+乘法逆元)

    Saving Beans Time Limit: 3000 MS Memory Limit: 32768 K Problem Description Although winter is far aw ...

  2. bzoj1272 Gate Of Babylon(计数方法+Lucas定理+乘法逆元)

    Description Input Output Sample Input 2 1 10 13 3 Sample Output 12 Source 看到t很小,想到用容斥原理,推一下发现n种数中选m个 ...

  3. hdu 3037 Saving Beans Lucas定理

    Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. 【BZOJ】2982: combination(lucas定理+乘法逆元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2982 少加了特判n<m return 0就wa了QAQ lucas定理:C(n, m)%p=( ...

  5. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  6. HDU 3037 Saving Beans(Lucas定理的直接应用)

    解题思路: 直接求C(n+m , m) % p , 由于n , m ,p都非常大,所以要用Lucas定理来解决大组合数取模的问题. #include <string.h> #include ...

  7. hdu3037 Saving Beans(Lucas定理)

    hdu3037 Saving Beans 题意:n个不同的盒子,每个盒子里放一些球(可不放),总球数<=m,求方案数. $1<=n,m<=1e9,1<p<1e5,p∈pr ...

  8. hihocoder #1698 假期计划 (排列组合+费马小定理+乘法逆元)

    Description 小Ho未来有一个为期N天的假期,他计划在假期中看A部电影,刷B道编程题.为了劳逸结合,他决定先拿出若干天看电影,再拿出若干天刷题,最后再留若干天看电影.(若干代指大于0)  每 ...

  9. [HDU3037]Saving Beans,插板法+lucas定理

    [基本解题思路] 将n个相同的元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m-1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序的m份,每个组依次按组序号分到对应位置的几个元 ...

随机推荐

  1. 在Android的webview中定做js的alert,confirm和prompt对话框的方法

    在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...

  2. lvs之nat技术的学习与实践

    lvs nat 服务器搭建 1.配置三个虚拟机.一台用于做lvs  两台用于做web server 进行测试 (lvs服务器要配备两块网卡); lvs 服务器  两块网卡 分别为vmnet1   vm ...

  3. Boltzmann机

    博客园不能上传附件,所以这里贴两张流程图吧.一个是模拟退火算法的流程图(Boltzmann机本实上就是反复退火的过程), 个是Boltzmann调整权值的过程.

  4. ubuntu 修改保存报错E37:No write since last change(add ! to override)的解决方法

    报错信息如下: E37: No write since last change (add ! to override) 解决办法是: 在修改完后,将命令 :q 改成 :wq 即可.

  5. Python的getattr()

    Python的getattr(),setattr(),delattr(),hasattr() getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGeta ...

  6. 应用 JD-Eclipse 插件实现 RFT 中 .class 文件的反向编译

    概述 反编译是一个将目标代码转换成源代码的过程.而目标代码是一种用语言表示的代码 , 这种语言能通过实机或虚拟机直接执行.文本所要介绍的 JD-Eclipse 是一款反编译的开源软件,它是应用于 Ec ...

  7. Search Range in Binary Search Tree

    Given two values k1 and k2 (where k1 < k2) and a root pointer to a Binary Search Tree. Find all t ...

  8. 对于sharepoint 的解决方案的实际说明

    对于sharepoint 的解决方案  实际上就是cab的包 你把***.wsp改为***.cab我们就可以查看这个包中的所有内容了

  9. 跨域请求获取Solr json检索结果并高亮显示

    Solr提供了json格式的检索结果,然而在跨域的情况下如何调用呢?我们可以利用jquery提供的jsonp的方式获取Solr检索结果. <script type="text/java ...

  10. 【转】windows下安装和调用curl的方法

    本文转自:http://1316478764.iteye.com/blog/2100778 curl是利用URL语法在命令行方式下工作的开源文件传输工具.它支持很多协议:FTP, FTPS, HTTP ...