hdu 3037 Lucas定理
题目可以转换成 x1+x2+……+xn=m 有多少组解,m在题中可以取0-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;
求一个组合数最后可化简为(a/b)%p
(a/b)%p可以转换成a*Inv(b,p) Inv(b,p)为b对p的逆元。
逆元 :(b/a) (mod n) = (b * x) (mod n)。 x表示a的逆元。并且 a*x ≡ 1 (mod n ) 注意:只有当a与n互质的时候才存在逆元
Sample Input
2
1 2 5
2 1 5
Sample Output
3
3
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <string> 6 # include <cmath> 7 # include <queue> 8 # define LL long long 9 using namespace std ; 10 11 LL n, m, p; 12 13 LL Ext_gcd(LL a,LL b,LL &x,LL &y){ 14 if(b==0) { x=1, y=0; return a; } 15 LL ret= Ext_gcd(b,a%b,y,x); 16 y-= a/b*x; 17 return ret; 18 } 19 LL Inv(LL a,int m){ //求逆元 20 LL d,x,y,t= (LL)m; 21 d= Ext_gcd(a,t,x,y); 22 if(d==1) return (x%t+t)%t; 23 return -1; 24 } 25 26 LL Cm(LL n, LL m, LL p) //求组合数 27 { 28 LL a=1, b=1; 29 if(m>n) return 0; 30 while(m) 31 { 32 a=(a*n)%p; 33 b=(b*m)%p; 34 m--; 35 n--; 36 } 37 return (LL)a*Inv(b,p)%p; //(a/b)%p 等价于 a*(b,p)的逆元 38 } 39 40 int Lucas(LL n, LL m, LL p) //把n分段递归求解相乘 41 { 42 if(m==0) return 1; 43 return (LL)Cm(n%p,m%p,p)*(LL)Lucas(n/p,m/p,p)%p; 44 } 45 46 int main() 47 { 48 //freopen("in.txt","r",stdin) ; 49 int T; 50 cin >> T; 51 while(T--) 52 { 53 cin>>n>>m>>p ; 54 cout<<Lucas(n+m,m,p)<<endl ; 55 } 56 return 0; 57 }
View Code
转载于:https://www.cnblogs.com/mengchunchen/p/4824299.html
hdu 3037 Lucas定理相关推荐
- HDU 3037 Saving Beans (Lucas法则)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3037 推出公式为C(n + m, m) % p. 用Lucas定理求大组合数取模的值 代码: #inc ...
- Saving Beans HDU - 3037(卢卡斯定理)
Saving Beans HDU - 3037(卢卡斯定理) 题意: 他们想知道有多少种方法可以在n树中保存不超过m个bean(它们是相同的). 现在他们求助于你,你应该给他们答案. 结果可能非常巨大 ...
- HDU 5226 Tom and matrix(组合数学+Lucas定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226 题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < ...
- 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix
Tom and matrix Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...
- hdu 3944 DP? (Lucas 定理)
仔细观察杨辉三角后可以发现从最高点到第n行第k个数的最短路为c(n+1,k); 根据Lucas定理可以求出,一般来说要求答案模去一个质数p且p的范围不大于10^5则可用Lucas. Lucas(n,m ...
- Lucas定理及组合数取模
首先给出这个Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n] ...
- Lucas定理与大组合数的取模的求法总结
Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38 1219人阅读 评论(0) 收藏 举报 c 首先给出这个Lucas定理: A.B是非负整数 ...
- 数论(Lucas定理) HDOJ 4349 Xiao Ming's Hope
题目传送门 题意:求C (n,0),C (n,1),C (n,2)...C (n,n)中奇数的个数 分析:Lucas 定理:A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a ...
- szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}
给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...
最新文章
- SAP WM 显示TR ITEM的标准报表LX09
- 互联网天生本质与产业大局的开始
- Android(安卓)一个简单的聊天界面的实现(eclipse实现)
- 融合升级谋定功能性-农业大健康·林裕豪:哲商对话从玉农业
- 绘制机械图c语言编程,求用C语言绘制机械三视图程序?
- 海量数据拆分到nosql系统的一种方案
- log4j2 mysql_spring boot使用log4j2将日志写入mysql数据库
- HTML5跑酷网页游戏源码
- 海康工业相机的一些坑(USB接口的相机连上halcon17后,客户端无法打开相机,错误是无驱动,但是驱动是好好的,如何解决)
- 两台电脑通过网线共享文件
- win7系统启动到一半停止_win7系统装到一半电脑死机怎么办
- Ambari2.7.4配置HIVE_AUX_JARS_PATH
- 小程序EXcel文件下载并打开
- NXP JN5169 读写片外 FLASH
- 想搭建一个专属于你的网站吗??新手向超详细攻略
- Rocket.chat 安装
- NVL和COALESCE的区别
- 分享技术人学习有用的国外网站
- [市场产品部]MP部副部长(陈晓慧):餐饮公司LOGO设计与制作
- 测试模型是出现:RuntimeErrorError(s) in loading state_dict for MIMO-UNet
热门文章
- fragtats中连接度指数(CONNECT)的具体解释
- 哔哩哔哩公司swot分析_是时候颠覆你的SWOT营销分析法了!TOWS分析法可能更适合你...
- mysql 加随机数,如何插入随机数MySql
- VSCODE 10个高效开发插件
- nginx location proxy_pass 后面的url 加与不加/的区别
- abp mysql .net core_ABP .Net Core Entity Framework迁移使用MySql数据库
- python鼠标碰撞_Python+opencv第5节鼠标响应事件,pythonopencv,第五节
- VINS简化版本 梳理
- JS-面向对象-改变This的指向---使用call方法改变this的指向 / 使用apply方法改变this的指向 / 使用bind方法改变this的指向
- C++primer 9.3.3节练习