HDU3037 Saving Beans(Lucas定理+乘法逆元)
题目大概问小于等于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定理+乘法逆元)的更多相关文章
- Hdu 3037 Saving Beans(Lucus定理+乘法逆元)
Saving Beans Time Limit: 3000 MS Memory Limit: 32768 K Problem Description Although winter is far aw ...
- bzoj1272 Gate Of Babylon(计数方法+Lucas定理+乘法逆元)
Description Input Output Sample Input 2 1 10 13 3 Sample Output 12 Source 看到t很小,想到用容斥原理,推一下发现n种数中选m个 ...
- hdu 3037 Saving Beans Lucas定理
Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 【BZOJ】2982: combination(lucas定理+乘法逆元)
http://www.lydsy.com/JudgeOnline/problem.php?id=2982 少加了特判n<m return 0就wa了QAQ lucas定理:C(n, m)%p=( ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- HDU 3037 Saving Beans(Lucas定理的直接应用)
解题思路: 直接求C(n+m , m) % p , 由于n , m ,p都非常大,所以要用Lucas定理来解决大组合数取模的问题. #include <string.h> #include ...
- hdu3037 Saving Beans(Lucas定理)
hdu3037 Saving Beans 题意:n个不同的盒子,每个盒子里放一些球(可不放),总球数<=m,求方案数. $1<=n,m<=1e9,1<p<1e5,p∈pr ...
- hihocoder #1698 假期计划 (排列组合+费马小定理+乘法逆元)
Description 小Ho未来有一个为期N天的假期,他计划在假期中看A部电影,刷B道编程题.为了劳逸结合,他决定先拿出若干天看电影,再拿出若干天刷题,最后再留若干天看电影.(若干代指大于0) 每 ...
- [HDU3037]Saving Beans,插板法+lucas定理
[基本解题思路] 将n个相同的元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m-1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序的m份,每个组依次按组序号分到对应位置的几个元 ...
随机推荐
- easyui 删除行bug
easyui删除行,出现了bug.(经常使用这个框架的人几乎都会遇到) 我也非常纳闷,今天特地试了很久. 最后发现,如果是自己datagrid('getRows') 然后迭代出来,最后算出行号,可以成 ...
- ruby on rails揭开route路由的真面目
文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 最近的项目里发现一个问题,大师和pp写的index页面就好使,我写index页面就不往index页面跳 ...
- Linux awk命令详解??????????(研究)
http://blog.chinaunix.net/uid-25120309-id-3801250.html 一. AWK 说明 awk是一种编程语言,用于在linux/unix下对文本和数据进行 ...
- css定位左移动多少距离
.main .logo { padding-left:82px; } 说明: .main .logo这个标签的路径离边框的距离是82Px
- Windows下的cmd命令行中设置环境编码
我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...
- Windows系统时间同步出错解决办法
有时候我们设置本地时间与Internet时间同步时,经常连接服务器time.windows.com超时,导致时间同步失败,解决办法如下: 利用快捷键"Win+R"调出运行框,输入: ...
- native app
Apache Cordova是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽出的核心代码,是驱动PhoneGap的核心引擎.你可以把他想象成类似于Webkit和Google ...
- Http协议之Get和Post的区别
get(默认值)是通过URL传递表单值,post传递的表单值是隐藏到http报文体中,url中看不到.区别(常考):get是通过url传递表单值,post通过url看不到表单域的值:get传递的数据量 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...