Lucas定理理解与应用

article/2025/9/21 11:55:50

【定义】

Lucas定理是用来求 C(n,m) mod p的值。条件:n和m是非负整数,p是素数

一般用于:n和m但p很小,或者n,m不大但大于p,这样用阶乘解决不了。

【公式】

表达式:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p。(可以递归)

 

递归方程:(C(n%p, m%p)*Lucas(n/p, m/p))%p。(递归出口为m==0,return 1)

二进制推导:

将n,m(0~n) 化为二进制数

a,b为n,m的二进制数

根据定理 C(n,m)=C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])

应用:HDU - 4349 Xiao Ming's Hope lucas

【例题+实现】

参考: https://blog.csdn.net/ACdreamers/article/details/8037918

假如现在叫你求:C(n,m)mod p,0<=p<=1e10,且p为素数

代码模板:(超时已经修改)

using namespace std;
typedef long long ll;LL n,m,mod;
//适用于p很大 
ll qpow(ll a,ll b)
{ll ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;
}
ll getc(ll a,ll b)
{if(a<b)return 0;if(b>a-b)b=a-b;ll s1=1,s2=1;for(ll i=0;i<b;i++){s1=s1*(a-i)%mod;s2=s2*(i+1)%mod;}return s1*qpow(s2,mod-2)%mod;
}
ll lucas(ll n,ll k)
{if(k==0)return 1;return getc(n%mod,k%mod)*lucas(n/mod,k/mod)%mod;
}

 

由于上题的p比较大,所以组合数只能一个一个计算,如果p的范围小点,那么就可以进行阶乘预处理计算了。

1.p固定的时候,且范围较大,n,m范围不大

n (1 ≤ n ,m≤ 1e6), k (0 ≤ k ≤ n).T (≤ 2000)  p为素数

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
#define LL __int64
const int N=2000100;
const int p=1000000007;LL fac[N];void init()   //预处理阶乘
{LL i;fac[0] =1;for(i =1; i < N; i++)fac[i] = fac[i-1]*i % p;
}LL exp_mod(LL a, LL b)
{LL tmp = a % p, ans =1;while(b){if(b & 1)  ans = ans * tmp % p;tmp = tmp*tmp % p;b >>=1;}return  ans;
}LL C(LL n, LL m)
{if(m > n)return 0;return  fac[n]*exp_mod(fac[m]*fac[n-m], p-2) % p;//逆元
}LL Lucas(LL n, LL m)
{if(m ==0)return 1;return  (C(n%p, m%p)*Lucas(n/p, m/p))%p;
}int main()
{int T;LL n,m,cas=1;init();scanf("%d",&T);while(T--){scanf("%lld %lld",&n,&m);printf("Case %lld: %lld\n",cas++,Lucas(n+m-1,m-1));}return 0;
}

 

2.HDU3944: http://acm.hdu.edu.cn/showproblem.php?pid=3944

1<=m<=n<=1e6和1<=p<=1e5,并且p可能为合数,

对于本题,由于访问的次数很大,所以当然得先预处理保存在数组中,然后用的时候就不用一次一次的再重复计算了,本题重在预处理。

#include <stdio.h>  
#include <string.h>  
#define N 10005  int p;  int prim[N];     //保存素数
int pth[N];      //保存当前数是第几个素数
bool prime[N];  
int fac[N][N];  
int inv[N][N]; 
//这里的fac[i][j]和inv[i][j]表示prime[i]的阶乘mod p和它的逆元int k=0;  void isprime()          //质数打表
{  int i,j;  memset(prime,true,sizeof(prime));  memset(pth,0,sizeof(pth));  for(i=2;i<N;i++)  {  if(prime[i])  {  prim[++k]=i;  pth[i]=k;  for(j=i+i;j<N;j+=i)  {  prime[j]=false;  }  }  }  
}  int quick_mod(int a,int b,int m)      //快速幂
{  int ans=1;  a%=m;  while(b)  {  if(b&1)  {  ans=ans*a%m;  b--;  }  b>>=1;  a=a*a%m;  }  return ans;  
}  void init()    //预处理阶乘数
{  int i,j;  for(int i=1;i<=k;i++)  {  fac[i][0]=inv[i][0]=1;  for(j=1;j<prim[i];j++)  {  fac[i][j]=(fac[i][j-1]*j)%prim[i];  inv[i][j]=quick_mod(fac[i][j],prim[i]-2,prim[i]);  }  }  }  int C(int n,int m)  
{  if(m>n) return 0;  if(m==n) return 1;  int t=pth[p];  return fac[t][n]*(inv[t][n-m]*inv[t][m]%p)%p;  
}  int Lucas(int n,int m)  
{  if(m==0)  return 1;  return C(n%p,m%p)*Lucas(n/p,m/p)%p;  
}  int main()  
{  int n,m,k=1;  isprime();  init();  while(~scanf("%d%d%d",&n,&m,&p))  {  if(m<=n/2) m=n-m;  printf("Case #%d: %d\n",k++,(m%p+Lucas(n+1,m+1)%p)%p);  }  return 0;  
}  

 


http://chatgpt.dhexx.cn/article/GCTkNjha.shtml

相关文章

ACM_算法_Lucas定理

Lucas定理是用于求解C(n,m)%p的问题 这里小编用一张图&#xff1a; 这张图就很完整的说明了Lucas定理的内容&#xff0c;比较简单&#xff0c;也比较好理解&#xff0c;小编也就不多说了。 #include <cstdio> #include <cstring> #include <iostream> #incl…

Lucas卢卡斯定理模板

题目算法要素&#xff1a;组合数学&线性求逆元&线性求阶乘的逆元&Lucas定理 题面&#xff1a; Lucas定理内容&#xff1a;不会的走传送门去oiwiki 分析&#xff1a; 由于这题n、m较大&#xff0c;因此直接硬算肯定会炸&#xff08;阶乘都算不完&#xff09;。 故…

Vue脚手架global安装出错

1.安装npm sudo apt-get install npm npm -v 查看npm版本 node -v 查看node版本 2.sudo npm install --global vue-cli发现报错出现 TypeError:this is not a typed array 原因是node版本过低导致的&#xff0c;解决办法&#xff1a; 1&#xff09;sudo npm install -g n 2)…

MySQL高级篇1

第01章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 查看是否安装过MySQL 如果你是用rpm安装, 检查一下RPM PACKAGE&#xff1a; rpm -qa | grep -i mysql # -i 忽略大小写检查mysql service&#xff1a; systemctl status mysqld.service1.2 MySQL的卸载 1. 关闭 mysql…

VScode 环境配置

1.把你的 VS Code 打造成 C 开发利器 https://cloud.tencent.com/developer/article/1555413 2.解决C代码在VSCode中无法快速跳转的问题。 在做C项目的时候&#xff0c; 发现在VSCODE里面的&#xff0c; 跳转很慢&#xff0c; 有时候还跳转失败。并且代码提示也不够友好。让…

在Global Mapper中导入点的文本格式

文章目录 有时候想在Global Mapper快速显示一个点的具体位置&#xff0c;来不及去创建一个具体的矢量文件。一个最快速的方式就是将这个点写在文本文件中导入&#xff1a; 13149831.629692005 2817252.5824931804 0 P1 导入后会询问你该文本文件的描述形式&#xff1a; 接着选择…

最强Microsoft Edge插件安装

一、Global Speed: 视频速度控制 Global Speed与几乎所有视频和音频流媒体站点兼容&#xff0c;包括Youtube&#xff0c;Netflix&#xff0c;哔哩哔哩&#xff0c;腾讯视频&#xff0c;百度网盘&#xff0c; 爱奇艺等。 当我们打开某个视频网站时&#xff0c;点击Global Spee…

关于node、vue、vue/cli安装的问题

新人一枚&#xff0c;说错勿喷。 今天在学习搭建安装vue脚手架&#xff08;vue/cli&#xff09;时碰到的问题。 在运行npm install vue/cli -g 报错&#xff0c;翻译过来大概的意思就是依赖包不对&#xff0c;在网上找了许多的资料。最后在别人博客中找到答案。 来源https://ww…

【GoWeb项目-个人Blog】初始化数据库和日志

2 初始化数据库和日志 项目地址&#xff1a;https://gitee.com/illlloooovvvvcode/daily-blog 2.1各种配置的目录结构 2.2 待初始的全局对象 global.go 存储全局对象 var (GVA_CONFIG conf.ConfGVA_DB *gorm.DBGVA_LOG *zap.Logger //只能输出结构化日志&…

PyTorch: visdom可视化

一、visdom可视化配置 1、安装visdom库 pip install visdom 2、配置环境 python -m visdom server 3、浏览器打开网址&#xff1a; visdomhttp://localhost:8097/ 二、显示的结果 三、代码 import torch import torch.nn as nn import torch.nn.functional as F impo…

关于小白安装nodejs遇到的问题(npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)

今天是7.8 问题已经解决啦&#xff01;连滚带爬的来更新了&#xff01; 总结&#xff1a;遇到这个问题有可能是因为自带的node版本过低&#xff01;并且升级win11的好像都会遇到 对我而言的错误方法一&#xff1a; 虽然现在有一个很火的帖子改文档-global成为–locationglob…

46.在ROS中实现global planner(2)- A*规划算法预研

前文45.在ROS中实现global planner&#xff08;1&#xff09;- 实现一个可以用的模板实现了一个global planner的模板&#xff0c;并且可以工作&#xff0c;本文将实现astar算法&#xff0c;为后续完成一个astar global planner做准备 1. AStar简介 1.1 AStar Astar算法是一…

【GlobalMapper精品教程】002:GlobalMapper中文版安装后的基本设置

本文讲述安装globalmapper后的一些简单基本设置&#xff08;持续更新&#xff09;&#xff0c;为后续深入学习软件打下基础。订阅专栏后私信作者&#xff0c;获取中文安装包及配套实验数据包。 文章目录 1. 工具条的显示与关闭2. 面积单位设置3. 选择所选面要素的边框4. 二三维…

nvm + nodejs + vue项目 环境搭建备忘

内容介绍&#xff1a; 传统 JavaScript 传统 JavaScript 运行在浏览器上&#xff0c;浏览器内核分为两个部分&#xff1a; 渲染引擎渲染HTML和CSSJavaScript 引擎 负责运行 JavaScrip…

python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则&#xff1a; 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:", name)print("age:", age)if "__main__" __name__:test1("admin_maxin", age…

关于Vivado综合选项——Out of context per IP和Gobal

Vivado生成IP输出文件注意的地方&#xff0c;是选择Global还是Out of context per IP: vivado默认是第二种&#xff0c;Out of context per IP是指让vivado在综合的时候对IP进行单独综合&#xff0c;生成.dcp文件&#xff0c;然后再工程要用到IP的时候&#xff0c;只需从.dcp文…

Oracle 临时表 (Gobal Temporary Table)

提问&#xff0c;插入数据之后&#xff0c;COMMIT&#xff0c;数据是否一定会在表里呢&#xff1f; 回答 一定会在。我认为没有错 回答 可能会在。也没有错 → 没在就一定是被删了&#xff0c;那么有一种表&#xff0c;会在Commit时&#xff0c;清空所有数据。 刚才说的那种…

转载:关于Vivado综合选项——Out of context per IP和Gobal

转载&#xff1a;关于Vivado综合选项——Out of context per IP和Gobal 原文地址&#xff1a;https://www.cnblogs.com/yhsy1002/p/7441309.html 关于Vivado综合选项——Out of context per IP和Gobal Vivado生成IP输出文件注意的地方&#xff0c;是选择Global还是Out of cont…

An Implemention of Realtime Gobal Illumination

前言&#xff1a;CG画面的“效果”最重要&#xff0c;至于达到这一效果所使用的技术倒是其次&#xff0c;一切的一切对于观众来说都是透明的。即使是Pixar都认为仅仅One Bounce Indirect Illumination对构建一个足够真实可信的光照效果足矣。看过这里的SII&#xff0c;我想你对…

Oracle ORA-06502 ORA-06512

问题描述&#xff1a; 发现存储过程里有对oracle <Collection>类型的操作 sql_text : select a.* from t_Drivewaystatus a inner join t_intersection b on a.intersectioncode b.intersectioncode where b.used 1 order by a.intersectioncode,a.drivewaycode; open…