当前位置: 首页 > news >正文

P4720 【模板】扩展卢卡斯

思路

扩展Lucas和Lucas定理其实没什么关系
我们要求的是这样的一个问题
\[ \left(\begin{matrix}n\\m\end{matrix}\right) mod\ P \]
p不一定是素数
所以需要CRT合并
问题转化为
\[ x\equiv \left(\begin{matrix}n\\m\end{matrix}\right) (mod\ p_1^{k_1}) \\ x\equiv \left(\begin{matrix}n\\m\end{matrix}\right) (mod\ p_2^{k_2})\\ \dots\\ x\equiv \left(\begin{matrix}n\\m\end{matrix}\right) (mod\ p_t^{k_t}) \]
然后因为\(p_1^{k_1},p_2^{k_2},\dots,p_t^{k_t}\)互质,所以直接CRT
现在要求的是$ \left(\begin{matrix}n\m\end{matrix}\right) (mod p_i^{k_i})$
由组合数的公式可知,要求的是\(n! (mod\p_i^{k_i} )\)
为了避免没有逆元,要先把阶乘中\(p_i\)全部消去,最后再乘回来(jc求质因数)
然后可以发现
有一部分是可以递归处理的(就是(n/pi)!)
有一部分在模pk意义下是有循环节的,枚举pk的长度,计算即可,出现了n/pk次
还有一部分剩下的,长度不会超过pk,暴力计算即可
然后就没了

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
int pow(int a,int b,int MOD){
    int ans=1;
    while(b){
        if(b&1)
            ans=(ans*a)%MOD;
        a=(a*a)%MOD;
        b>>=1;
    }
    return ans;
}
int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    int req=exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return req;
}
int inv(int a,int p){
    if(!a) 
        return 0;
    int x,y;
    exgcd(a,p,x,y);
    x=((x%p+p)%p);
    if(!x)
        x+=p;
    return x;
}
int mul(int n,int pi,int pk){//get n!/pi^a%p^k
    if(!n)
        return 1;
    int ans=1;
    for(int i=2;i<=pk;i++)
        if(i%pi)
            ans=(ans*i)%pk;
    ans=pow(ans,n/pk,pk);
    for(int i=2;i<=n%pk;i++)
        if(i%pi)
            ans=(ans*i)%pk;
    return ans*mul(n/pi,pi,pk)%pk;
}
int C(int n,int m,int Mod,int pi,int pk){
    if(m>n)
        return 0;
    int jcn=mul(n,pi,pk),jcm=mul(m,pi,pk),jcnm=mul(n-m,pi,pk),k=0;
    for(int i=n;i;i/=pi)
        k+=i/pi;
    for(int i=m;i;i/=pi)
        k-=i/pi;
    for(int i=n-m;i;i/=pi)
        k-=i/pi;
    int ans=jcn*inv(jcm,pk)%pk*inv(jcnm,pk)%pk*pow(pi,k,pk)%pk;
    return ans*(Mod/pk)%Mod*inv(Mod/pk,pk)%Mod;
}
int exLucas(int n,int m,int Mod){
    int ans=0;
    for(int i=2,t=Mod;i<=Mod;i++){
        if(!(t%i)){
            int midpk=1;
            while(!(t%i)){
                midpk*=i;
                t/=i;
            }
            ans=(ans+C(n,m,Mod,i,midpk))%Mod;
        }
    }
    return ans;
}
int n,m,MOD;
signed main(){
    scanf("%lld %lld %lld",&n,&m,&MOD);
    printf("%lld\n",exLucas(n,m,MOD));
    return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10533590.html

相关文章:

  • Linux 遭入侵,挖矿进程被隐藏排查记录
  • 血淋淋的BUG:波音在软件开发上错在哪里?
  • Python安装常见问题(1):zipimport.ZipImportError: can't decompress data
  • 当今软件发展的现状非常适合 Cloud Native 环境
  • Leetcode PHP题解--D8 832. Flipping an Image
  • Aspx 网页跳转方法 摘要一个大佬的自用
  • 四、RabbitMQ3.7在CentOS7下的安装
  • SpringCloud SpringBoot mybatis分布式微服务云架构返回JSON格式
  • node.js学习笔记
  • leetCode笔记--(1)
  • 致学习java同学奔三的90后:蹦最嗨的深夜迪,喝着啤酒配枸杞。
  • Exchange 2010/2016服务器远程重启命令
  • JVM的类加载机制
  • 一分钟带你弄懂闭包
  • 自建Kubernetes的LoadBalancer类型服务方案-MetalLB
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • Git的一些常用操作
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JSONP原理
  • js面向对象
  • use Google search engine
  • Vue 2.3、2.4 知识点小结
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 移动端 h5开发相关内容总结(三)
  • 在weex里面使用chart图表
  • Android开发者必备:推荐一款助力开发的开源APP
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Python第六天)文件处理
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (一)RocketMQ初步认识
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)jQuery 基础
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献