Lucas 定理

Lucas 定理:n、m是非负整数,p是素数。那么:

1、C(n,m)% p = Lucas(n,m,p)

2、Lucas(n,m,p)= (C(n%p,m%p)% p)*Lucas(n/p,m/p,p)

证明:

我们将n和m表示成p进制数:n = akak-1..a1(p)  m = bkbk-1...b1(p)(位数不够高位补0)

通过简单分析,可以得到: C(n,m)和C(a1,b1)*C(a2,b2)*...*C(ak,bk)关于p同余

n = ak*p^(k-1) + ... + a1      m = bk*p^(k-1) + ... + b1

关于为什么同余,可以通过上面的式子观察出来,也可通过精确推导得出,篇幅所限,这里也不在累述。

 

我们已经知道了,Lucas定理的公式,但是关键是怎么编码来得出结果呢?

也许你会说,那还不简单,直接递归就搞定了,其实没那么简单,还有一个重要的问题没解决,C(ai,bi)(mod p)的求法。

这里还涉及到逆元以及欧拉-费马定理的应用。

 

关于C(n,m)(mod p)(p为素数)的求法:

1、C(n,m)= n! / (m! * (n - m)!) (组合数的求法)

2、(a / b) (mod p) = (a * x) (mod p) x表示b的逆元 并且 b * x = 1 (mod p)(乘法逆元)

3、b^phi(p) = 1 (mod p)(b和p互质,phi(p)为p的欧拉函数值) (欧拉-费马定理)

通过上述三式,我们知道了C(n,m)(mod p)的求法,用fac[i] = i! % p

C(n,m)(mod p) = fac[n] * pow(fac[m]*fac[n-m],p-2)

code:

 1 #include <cstdio>
 2 typedef __int64 LL;
 3 const int MAXN = 1000005;
 4 LL n, m, p;
 5 LL fac[MAXN];
 6 
 7 // 得到阶乘  fac[i] = i! % p
 8 void GetFact()
 9 {
10     fac[0] = 1;
11     for (LL i = 1; i < MAXN; ++i)
12         fac[i] = fac[i - 1] * i % p;
13 }
14 
15 // 快速模幂 a^b % p
16 LL Pow(LL a, LL b)
17 {
18     LL temp = a % p;
19     LL ret = 1;
20     while (b)
21     {
22         if (b & 1) ret = ret * temp % p;
23         temp = temp * temp % p;
24         b >>= 1;
25     }
26     return ret;
27 }
28 
29 /*
30 欧拉定理求逆元
31 
32 (a / b) (mod p) = (a * x) (mod p) x表示b的逆元 并且 b * x = 1 (mod p) 只有b和p互质才存在逆元
33 
34 b * x = 1 (mod p) x是b关于p的逆元
35 
36 b^phi(p) = 1 (mod p)
37 
38 b * b^(phi(p) - 1) (mod p) = b * x (mod p)
39 
40 x = b^(phi(p) - 1) = b^(p - 2)
41 
42 (a / b) (mod p) = (a * x) (mod p) = (a * b^(p - 2)) (mod p)
43 
44 经过上面的推导,得出:
45 
46 (a / b) (mod p) = (a * b^(p - 2)) (mod p) (b 和 p互质)
47 
48 */
49 LL Cal(LL n, LL m)
50 {
51     if (m > n) return 0;
52     return fac[n] * Pow(fac[m] * fac[n - m], p - 2) % p;
53 }
54 
55 LL Lucas(LL n, LL m)
56 {
57     if (m == 0) return 1;
58     return Cal(n % p, m % p) * Lucas(n / p, m / p) % p;
59 }
60 
61 int main()
62 {
63     int nCase;
64     scanf("%d", &nCase);
65     while (nCase--)
66     {
67         scanf("%I64d %I64d %I64d", &n, &m, &p);
68         printf("%I64d\n", Lucas(n, m));
69     }
70     return 0;
71 }

 

转载于:https://www.cnblogs.com/ykzou/p/4494902.html

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

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

相关文章

太牛了,原来古人是这样铸造钱币的。。。

全世界只有3.14 % 的人关注了爆炸吧知识古代钱币是怎么做出来的呢&#xff1f;今天与各位说说古钱币的铸造工艺&#xff0c;抛砖引玉让大家更多了解假货的鉴别特点。关于古代钱币铸造工艺的记录文献资料&#xff0c;遗留极少。关于母钱翻砂技术&#xff0c;最早的史料见于明代宋…

渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 汉

中文名: 终级渲染器 渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 顶渲简体中文版 资源格式: 压缩包 版本: R3.5 发行时间: 2010年 制作发行: 原创:cebas VISUAL TECHNOLOGY Inc 中文:顶渲 Ma5 www.toprender.com 地区: 德国 语言: 简体中文,…

java赋值语句_java并发编程之原子性问题

程序是否线程安全&#xff0c;取决于哪些要素呢&#xff0c;主要是以下三个&#xff1a;原子性&#xff0c;可见性&#xff0c;有序性。今天先一起来学习原子性。原子性&#xff1a;我理解一个操作不可再分&#xff0c;即为原子性。而在并发编程的环境中&#xff0c;原子性的含…

“高阶思维”发展意识

1. 前言这个题目不太好交流&#xff0c;因为每个人的认知层面不同&#xff0c;不好达成大多数人趋近相同的看法。这个题目高度抽象化&#xff0c;不谈具体化的内容显得空洞及不容易理解&#xff0c;谈具体化的内容又无法找到着力点。抽象能力本身就是高阶思维的一种体现形式&a…

AngularJS快速入门指南09:SQL

我们可以将之前章节中的代码用来从数据库中读取数据。 通过PHP Server从MySQL数据库中获取数据 <div ng-app"myApp" ng-controller"customersCtrl"> <table><tr ng-repeat"x in names"><td>{{ x.Name }}</td><…

jdbc mysql user_tab_comments_mysql/jdbc:设置useInformationSchema=true读取表注释信息(table_comment)...

问题描述今天在读取表的注释信息(COMMENT)时,发现返回的REMARKS字段返回居然是null.以下是代码示例:DatabaseMetaData meta this.pConnection.getMetaData();// 获取所有表信息ResultSet resultSet this.meta.getTables(this.catalog, tableSchema, pattern, this.tableTypes…

SQL Server返回当前实例系统日期和时间的函数

下面列举出SQL Server返回实例系统日期和时间的函数&#xff0c;除了ANSI标准函数CURRENT_TIMESTAMP在应用时无需在函数后多加一对空的小括号"()"外&#xff0c;其余均需。 从返回的数据类型"DATETIME2"就可以知道&#xff0c;后面三个函数是SQL Server 20…

培养沙雕要从娃娃抓起

1 培养沙雕要从娃娃抓起▼2 好了好了你们两个可以去洗发店门口上班了▼3 毛绒版俄罗斯方块纵享丝滑▼4 我还以为会有令人期待的被打环节▼5 小蜘蛛你好我是唐僧&#xff0c;请问我可以跟你回盘丝洞吗▼6 吃冰淇淋讲究直接上手▼7 在等奶茶的美团小哥我也想像他一样出门荡…

详解Ubuntu for Android:Thin Client

原文地址&#xff1a;http://blog.csdn.net/ce123/article/details/7291445 详解Ubuntu for Android&#xff1a;Thin Client 一、Ubuntu for Android的定义 在移动终端性能日益强大、多核处理器基本普及的现在&#xff0c;将通用的Ubuntu操作系统与Android系统进行亲密的整合&…

Dapr + .NET 实战(九)本地调试

前几节开发Dapr应用程序时&#xff0c;我们使用 dapr cli 来启动dapr服务&#xff0c;就像这样&#xff1a;dapr run --dapr-http-port 3501 --app-port 5001 --app-id frontend dotnet .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll如果你想要通过dapr调试服务呢&#xff1f;在…

javadoc文档的生成方法_[springboot 开发单体web shop] 4. Swagger生成Javadoc

Swagger生成JavaDoc在日常的工作中&#xff0c;特别是现在前后端分离模式之下&#xff0c;接口的提供造成了我们前后端开发人员的沟通成本大量提升&#xff0c;因为沟通不到位&#xff0c;不及时而造成的[撕币]事件都成了日常工作。特别是很多的开发人员不擅长沟通&#xff0c;…

15个IT技术人员必须思考的问题

行内的人自嘲是程序猿、屌丝和码农&#xff0c;行外的人也经常拿 IT 人调侃&#xff0c;那么究竟是 IT 人没有价值&#xff0c;还是没有仔细思考过自身的价值&#xff1f; 1. 搞 IT 的是屌丝、码农、程序猿&#xff1f; 人们提到 IT 人的时候&#xff0c;总会想到他们呆板、不解…

mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

##状况描述突然收到MySQL报警&#xff0c;从库的数据库挂了&#xff0c;一直在不停的重启&#xff0c;打开错误日志&#xff0c;发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。现在记录下解决过程&#xff0c;下次遇到就不会这么手忙脚乱了。处理…

20幅扎心漫画,道尽无数人的人生!30万网友:这简直是在偷窥我生活...

全世界只有3.14 % 的人关注了爆炸吧知识每个人在这世界上都是独特的个体但我们常常在很多方面把生活过得很类似在ins上&#xff0c;名叫Sanesparza的博主就把生活中的各种细节通过漫画的形式表达引来31万网友围观许多人纷纷表示&#xff1a;这不就是我吗&#xff01;太扎心了&a…

多种方法解决Exchange 2010 EMC批量启用邮箱之后出..

平时大家在做Exchange 项目的时候都是需要批量导入AD账户和批量启用AD账户的邮箱,但是有一个比较奇怪的问题是当你使用Exchange 2010 EMC来批量启用邮箱之后会出现乱码问题,并且邮箱用户不能发送和接收电子邮件,那么该如何处理乱码问题呢?不要着急,其实有3种方法可以处理Excha…

聊聊横向领导力

背景与人合作绝对是世界上最难的事情之一&#xff0c;时间往往在摩擦中白白消耗&#xff0c;分到与自身能力不相称的任务&#xff0c;或是由于某种差异而冲突不断&#xff0c;长达数小时但结果欠奉的会议可以说是司空见惯。有时我们磨合团队所花的时间甚至远远超出完成实质性工…

java加载dll UnsatisfiedLinkError: no mydll in java.library.path

System.loadLibrary("mydll"); 运行异常&#xff1a;java.lang.UnsatisfiedLinkError: no mydll in java.library.path 解决方式&#xff1a;把dll放到path中 java.library.path可以打印看相关路径System.out.println(System.getProperty("java.library.path&qu…

matlab菲涅尔衍射_有问必答——SYNOPSYS安装体验课堂——可以设计菲涅尔透镜吗?...

问&#xff1a;SYNOPSYS可以设计菲涅尔透镜吗&#xff1f;答&#xff1a;在USS中有多种菲涅尔面型&#xff0c;用户输入参数即可。问&#xff1a;SYNOPSYS中具有的输入方式&#xff1f;答&#xff1a;大家总是有个误区&#xff0c;以为SYNOPSYS需要输入命令运行&#xff0c;其实…

介绍一下Objective-c常用的函数,常数变量

算术函数 函数名说明int rand()随机数生成。&#xff08;例&#xff09;srand(time(nil)); //随机数初期化int val rand()%50; //0&#xff5e;49之间的随机数int abs(int a)整数的绝对值&#xff08;例&#xff09;int val abs(-8); →8※浮点数的时候用fabs。double fab…

WeakReference reference quene GC

在了解WeakReference之前,先给出一段简单的代码: public class WeakReferenceTest {public static void main(String[] args) throws Exception {Object o new Object();// 默认的构造函数&#xff0c;会使用ReferenceQueue.NULL 作为queueWeakReference<Object> wr ne…