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])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同余

即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 

这个定理的证明不是很简单,我一直想找个很好的张明,但是,没找到,昨天看到了一个解题报告,基本上可以说明白这个Lucas定理是怎么回事了,具体的是说:

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

这个是单独处理n!的情况,当然C(n,m)就是n!/(m!*(n-m)!),每一个阶乘都用上面的方法处理的话,就是Lucas定理了,注意这儿的p是素数是有必要的。


贴一个例题的代码,方便以后看。

hdu 3037

将不大于m颗种子存放在n颗树中,问有多少种存法。

首先是不大于m颗种子,我没可以认为少于m的那些种子存放在了第n+1颗树上,这样的话,问题就转化成了将m颗种子存放在n+1颗树上的方案数。ok这个是组合数学里面的公式,亦即插板法,也就是X1+X2+X3+……+Xn+1 = m;ok,答案是C(n+m,m);

然后就是上面说的Lucas定理解决大组合数问题了

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;#define N 100010long long mod_pow(int a,int n,int p)
{long long ret=1;long long A=a;while(n){if (n & 1)ret=(ret*A)%p;A=(A*A)%p;n>>=1;}return ret;
}long long factorial[N];void init(long long p)
{factorial[0] = 1;for(int i = 1;i <= p;i++)factorial[i] = factorial[i-1]*i%p;//for(int i = 0;i < p;i++)//ni[i] = mod_pow(factorial[i],p-2,p);
}long long Lucas(long long a,long long k,long long p) //求C(n,m)%p p最大为10^5。a,b可以很大!
{long long re = 1;while(a && k){long long aa = a%p;long long bb = k%p;if(aa < bb) return 0; //这个是最后的改动!re = re*factorial[aa]*mod_pow(factorial[bb]*factorial[aa-bb]%p,p-2,p)%p;//这儿的求逆不可先处理a /= p;k /= p;}return re;
}int main()
{int t;cin >> t;while(t--){long long n,m,p;cin >> n >> m >> p;init(p);cout << Lucas(n+m,m,p) << "\n";}return 0;
}

//以上为前几届学长的lucas相关总结,在此基础上,做了少许的修改。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统优化设置-之二

5、关掉不必要的服务 单击“开始”→“设置”→“控制面板”。双击“管理工具”→“服务”&#xff0c;打开后将看到服务列表&#xff0c;有些服务已经启动&#xff0c;有些则没有。右键单击要配置的服务&#xff0c;然后单击“属性”。在“常规”选项卡上选择“自动”、“手动…

CCPC网络赛前一周的充电计划

CCPC大概还有一周左右的时间&#xff0c;在这一周内&#xff0c;要补充一些数学内容&#xff0c;避免出现像去年学长们一样出现的情况&#xff0c;不能出现在碰到相关题目的时候面面相嘘不知所以然。 所以这几天的计划大体是&#xff1a; 1. Lucas定理 : 题库 2. 中国剩余定…

解决手机死机之锦囊妙计

引言 不久前买的586W我的是T版的英文说明书,只见说明书中介绍说如果死机的话只须拔掉电池重新安回即可.当时我就郁闷了拔电池呀?多伤机器呀?有一次下载了个JAVA游戏,刚运行就死机了(游戏BUG).于是我便想到了说明书中说道的拔电池.思前想后还是没拔,怕伤了机器;我抱着试试…

hdu 4349——Xiao Ming's Hope

题意&#xff1a;给定n&#xff0c;让求c(n,0),c(n,1)……c(n,n)中有多少奇数。 思路&#xff1a;本题为Lucas定理推导题&#xff0c;我们分析一下 C(n,m)%2,那么由lucas定理&#xff0c;我们可以写 成二进制的形式观察&#xff0c;比如 n1001101&#xff0c;m是从000000到10…

介绍及安装

不知读者是否听说过“宠物大战”&#xff1f;大意为Sun公司为帮助开发人员和架构师使用J2EE技术&#xff0c;发布了一个在线宠物商店Sun Java Pet Store。而微软公司则利用.NET技术也发布了一个实现同样功能的PetShop&#xff0c;并且在代码数量、性能等各方面对二者进行了比较…

hdu5446——Unknown Treasure

题意&#xff1a;给定n和m&#xff0c;求c(n,m)%(∏ p)的值&#xff0c;相当于lucas定理的一个推广&#xff0c;在p不是素数的情况下的一个解决方法。 思路&#xff1a; 首先对于c(n,m)%p[i]来讲&#xff0c;是一个lucas的裸题&#xff0c;那么对于c(n,m)%(∏ p)划分成lucas子…

自定函数获取datagrid,datalist,rpeater控件中header,footer栏中控件

在论坛上看到很多关于datagrid,gridview,datalist,rpeater提取header,footer中控件的问题,整理了一下.供大家分享下面我以DataGrid为便进行说明.footer栏又称页脚栏,在很多时候我们可以在该栏放页码及相当的功能键.但是最后在获得这些控件引用的时候就会有点麻烦,由于footer(页…

如何做好一名软件实施人员 (转载)

通过一年的软件实施&#xff0c;使我深深的感觉到&#xff0c;软件实施&#xff0c;其实并不是一件很容易的事&#xff0c;也许可算是一项挑战&#xff0c;很需要“明知山有虎&#xff0c;偏向虎山行”的信心和勇气。为什么这样说呢&#xff1f; 因为&#xff0c;软件实施可以说…

hdu 5802——Windows 10

题意&#xff1a;给定两个音量&#xff0c;需要从l调到r&#xff0c;每次只能向上一下或者向下&#xff08;1&#xff0c;2&#xff0c;4&#xff0c;2^n&#xff09;下&#xff08;连续向下的情况下&#xff09;&#xff0c;每次可以停歇或向上来打断向下的连续性&#xff0c;…

20160807_第一周周报

写在前面 以后每周周日要进行一次周报&#xff0c;内容长短不限&#xff0c;为这一周的知识点和心态方面的总结&#xff0c;还有就是对未来的相关规划和调节&#xff01;知识点方面 在知识点方面进度不是太大&#xff0c;打的还是一般化的套路&#xff0c;在这个周的前几天的…

微软认证题库

微软认证题库 70-320XML Web Service开发for C#模拟题实用软件工程方法题库MCP 70-300&#xff1a;基于.NET的需求分析和解决方案设计认证题库三个认证题库点击直接下载posted on 2007-12-12 22:32 当当 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/hyzhi/a…

hdu 5783——Divide the Sequence

题意及思路&#xff1a; 求一个序列的分段个数&#xff0c;使得每一段的前缀和为0&#xff0c;如果正向思维&#xff0c;那么解法是从前往后遍历&#xff0c;每遇到一个负数就向前遍历直到>0&#xff08;这样贪心保证了序列尽可能多&#xff09;,但是这样最坏的情况是n^2的…

IE7快捷键

快捷方式 常规 打开或关闭全屏模式F11移动选择网页上的地址栏、“刷新”按钮、搜索框和项目Tab查找页面上的字词或短语CtrlF在新窗口中打开当前网页CtrlN打印页面CtrlP选择页面上的所有项目CtrlA放大Ctrl加号缩小Ctrl减号缩放到 100%Ctrl0导航快捷方式 转至主页 AltHome后退Alt…

BestCoder Round #86 1002 HDU 5805 ——NanoApe Loves Sequence

题意 给定一个数列&#xff0c;随机从该数列里删除一个数&#xff0c;求该数列的的相邻之间的绝对值的最大值的和。 思路 两个数列来分别维护i位前面的相邻的绝对值的最大以及i后面的最大&#xff0c;枚举每一个可能删除的数&#xff0c;然后分别从左右和要删除的这个空档里…

BestCoder Round #86 1003 HDU 5806——NanoApe Loves Sequence Ⅱ

题意&#xff1a; 给定一个序列&#xff0c;问在这个序列里有多少区间第k的的数>m 思路&#xff1a; 在比赛的时候是多想了&#xff0c;开始像区间第k大的问题&#xff0c;赛后想想实在是偏了。 正确的解法是枚举起点然后用尺取法维护一段区间&#xff0c;直到找到k个数…

Could not load the assembly 'DotNetNuke.Authentication.LiveID'. Make sure that it is compiled before

今天发生一个莫名的错误&#xff1a;Could not load the assembly DotNetNuke.Authentication.LiveID. Make sure that it is compiled before&#xff0c;在网上找了下有如下的解释&#xff1a; My understanding and perhaps a core member would be willing to correct me i…

详细讲解Java中log4j的使用方法

详细讲解Java中log4j的使用方法 作者: 网络 来源: 日期: 2008-1-3 23:40:24 1、Log4j是什么&#xff1f; Log4j可以帮助调试&#xff08;有时候debug是发挥不了作 用的&#xff09;和分析&#xff0c;要下载和了解更具体的内容&#xff0c;还是访问其官方网站吧&#xff1a; ht…

HDU 1402——A * B Problem Plus

题意&#xff1a; 给定a&#xff0c;b&#xff0c;求a*b。 思路&#xff1a; a,b的长度都为50000&#xff0c;直接模拟计算n*m肯定超时&#xff0c;可以用快速傅里叶变化计算&#xff0c;然后再把相应的系数化简出来。 code&#xff1a; #include <iostream> #inclu…

随机广告图片

1<script language”JavaScript”>2var imageList newArray;3imageList[0] “image1.jpg”;4imageList[1] “image2.jpg”;5imageList[2] “image3.jpg”;6imageList[3] “image4.jpg”;7var urlList newArray;8urlList[0] “http://some.host/”;9urlList[1] “http://a…

HDU 4609——3-idiots

题意&#xff1a; 给定n个数&#xff0c;随机从这n个数中取3个数&#xff0c;问能组成三角形的概率是多少&#xff1f; 思路&#xff1a; 首先把统计这n个数出现的个数&#xff0c;那么会得到一个向量&#xff0c;这个向量的自我的乘积就是a[i]a[j]的可能的方案数&#xff0…