卢卡斯定理及其扩展 模板
时间:2021-07-13
本文章向大家介绍卢卡斯定理及其扩展 模板,主要包括卢卡斯定理及其扩展 模板使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
\(……\)貌似没甚么要说明的
\(Lucas\)定理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,g;
int qpow(int a,int b,int md){
ll res=1;
for(;b;b>>=1,a=(ll)a*a%md)
if(b&1)
res=(ll)res*a%md;
return res;
}
ll C(int x,int y,int p){
if(y>x)
return 0;
if(y>x-y)
y=x-y;
ll a=1,b=1;
for(int i=0;i<y;i++){
a=(a*(x-i))%p;
b=(b*(i+1))%p;
}
return a*qpow(b,p-2,p)%p;
}
ll Lucas(int x,int y,int p){
if(y==0)
return 1;
return Lucas(x/p,y/p,p)*C(x%p,y%p,p)%p;
}
int main(){
cin>>t;
for(int k=1;k<=t;k++){
int n,m;
cin>>n>>m>>g;
cout<<Lucas(n+m,m,g)<<endl;
}
}
注:这也是\(P3807\)的正解
扩展\(Lucas\)定理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,p;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
ll qpow(ll a,ll b,ll md){
int res=1;
for(;b;b>>=1,a=(ll)a*a%md)
if(b&1)
res=(ll)res*a%md;
return res;
}
ll fac(ll n,ll pi,ll pk){
if(!n)
return 1;
ll res=1;
for(ll i=2;i<=pk;++i)
if(i%pi)
(res*=i)%=pk;
res=qpow(res,n/pk,pk);
for(ll i=2;i<=n%pk;++i)
if(i%pi)
(res*=i)%=pk;
return res*fac(n/pi,pi,pk)%pk;
}
ll inv(ll n,ll mod){
ll x,y;
exgcd(n,mod,x,y);
return (x+=mod)>mod?x-mod:x;
}
ll CRT(ll b,ll mod){
return b*inv(p/mod,mod)%p*(p/mod)%p;
}
ll C(ll n,ll m,ll pi,ll pk){
ll up=fac(n,pi,pk),d1=fac(m,pi,pk),d2=fac(n-m,pi,pk);
ll k=0;
for(ll i=n;i;i/=pi)
k+=i/pi;
for(ll i=m;i;i/=pi)
k-=i/pi;
for(ll i=n-m;i;i/=pi)
k-=i/pi;
return up*inv(d1,pk)%pk*inv(d2,pk)%pk*qpow(pi,k,pk)%pk;
}
ll exLucas(ll n,ll m){
ll res=0,tmp=p,pk;
int lim=sqrt(p)+5;
for(ll i=2;i<=lim;++i)
if(tmp%i==0){
pk=1;
while(tmp%i==0)
pk*=i,tmp/=i;
(res+=CRT(C(n,m,i,pk),pk))%=p;
}
if(tmp>1)
(res+=CRT(C(n,m,tmp,tmp),tmp))%=p;
return res;
}
int main(){
cin>>n>>m>>p;
cout<<exLucas(n,m);
return 0;
}
注:这也是\(P4720\)的正解
原文地址:https://www.cnblogs.com/BFcnblogs/p/15006648.html
- ubuntu中配置hadoop
- jQuery选择器大全(48个代码片段+21幅图演示)
- C# 如何在Excel 动态生成PivotTable
- RabbitMQ入门HelloWorld(C#)(翻译)
- Centos环境下搭建Asp.NET Core环境和安装Jexus
- Linux系统Java环境安装配置
- ASP.NET Core 依赖注入
- 使用Hive SQL插入动态分区的Parquet表OOM异常分析
- 基于STS和JWT的微服务身份认证
- 小程序前端开发基础框架,可直接用于开发
- “盲”逆向:iOS 应用 Blind 寻踪
- Redis应用及安装
- 微服务实践分享与探讨
- 微信小程序获取用户信息签名解密C#
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android判断字符串中是否含字母、中文或数字
- 利用Kotlin开发你的第一个Android应用
- Android Picasso使用高斯模糊处理的示例代码
- Android RecyclerView打造悬浮效果的实现代码
- Android选择图片或视频进行循环播放
- Android第三方登录之QQ登录
- Android利用CountDownTimer实现验证码倒计时效果实例
- Android开发实现读取Assets下文件及文件写入存储卡的方法
- Android studio实现刮刮乐的方法
- Android studio圆形进度条 百分数跟随变化
- Android中的SpannableString与SpannableStringBuilder详解
- 浅谈Android 中图片的三级缓存策略
- Android主线程和子线程区别详解
- Android 用RxBinding与RxJava2实现短信验证码倒计时功能
- Android右滑返回上一个界面的实现方法