求$C_n^m mod p$,其中p不是质数且不保证p能分解为几个不同质数的乘积(也就是不能用crt合并)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
#define int long long
using namespace std;
int n,m,p;
int q_pow(int a,int b,int p){
int res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
inline void exgcd(re int a,re int b,re int &x,re int &y){
if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
re int t=x;
x=y,y=t-(a/b)*y;
}
inline int inv(re int a,re int b){
re int x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
inline int crt(re int x,re int p,re int mod){
return inv(p/mod,mod)*(p/mod)*x;
}
inline int fac(re int x,re int a,re int b){
if(!x) return 1;
re int ans=1;
for(re int i=1;i<=b;i++)
if(i%a) ans*=i,ans%=b;
ans=q_pow(ans,x/b,b);
for(re int i=1;i<=x%b;i++){
if(i%a) ans*=i,ans%=b;
}
return ans*fac(x/a,a,b)%b;
}
inline int C(re int n,re int m,re int a,re int b){
re int N=fac(n,a,b),M=fac(m,a,b),Z=fac(n-m,a,b),sum=0;
for(re int i=n;i;i=i/a) sum+=i/a;
for(re int i=m;i;i=i/a) sum-=i/a;
for(re int i=n-m;i;i=i/a) sum-=i/a;
return N*q_pow(a,sum,b)%b*inv(M,b)%b*inv(Z,b)%b;
}
inline int exlucas(re int n,re int m,re int p){
re int t=p,ans=0;
for(re int i=2;i*i<=p;i++){
re int k=1;
while(t%i==0)
k*=i,t/=i;
ans+=crt(C(n,m,i,k),p,k),ans%=p;
}
if(t>1) ans+=crt(C(n,m,t,t),p,t),ans%=p;
return ans%p;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&p);
printf("%lld\n",exlucas(n,m,p));
return 0;
}

质因数分解求组合数:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1000006
#define re register
#define int long long
using namespace std;
int n,m,p;
int min(int a,int b){
return a<b?a:b;
}
int max(int a,int b){
return a>b?a:b;
}
inline int q_pow(re int a,re int b,re int p){
int res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res%p;
}
int prime[MAXN],pr[MAXN],tot=0;
bool vis[MAXN];
void get_prime(int N){
vis[1]=1;
for(int i=2;i<=N;i++){
if(!vis[i]) prime[++tot]=i,pr[i]=tot;
for(int j=1;j<=tot&&i*prime[j]<=N;j++){
vis[i*prime[j]]=1,pr[i*prime[j]]=j;
if(!(i%prime[j])) break;
}
}
}
int d[MAXN];
void add(int x,int val){
while(x!=1){
d[pr[x]]+=val;
x/=prime[pr[x]];
}
}
inline int C(int n,int m,int p){
int res=1;
for(int i=1;i<=m;++i)
add(n-i+1,1),add(i,-1);
for(re int j=1;j<=tot;j++){
for(re int k=1;k<=d[j];k++)
(res*=prime[j])%=p;
}
return res;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&p);
get_prime(n);
printf("%lld\n",C(n,m,p));
return 0;
}

模板:exlucas的更多相关文章

  1. NOIP模板总结

    NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...

  2. 洛谷P4720 【模板】扩展卢卡斯

    P4720 [模板]扩展卢卡斯 题目背景 这是一道模板题. 题目描述 求 C(n,m)%P 其中 C 为组合数. 输入输出格式 输入格式: 一行三个整数 n,m,p ,含义由题所述. 输出格式: 一行 ...

  3. exLucas学习笔记

    exLucas学习笔记 Tags:数学 写下抛硬币和超能粒子炮改 洛谷模板代码如下 #include<iostream> #define ll long long using namesp ...

  4. 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题

    扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...

  5. 【知识总结】扩展卢卡斯定理(exLucas)

    扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...

  6. 【模板整合计划】NB数论

    [模板整合计划]NB数论 一:[质数] 1.[暴力判] 素数.コンテスト.素数 \(\text{[AT807]}\) #include<cstdio> #include<cmath& ...

  7. exlucas易错反思

    模板和题解 复习了一下 exlucas的模板,结果写挂四次(都没脸说自己以前写过 是该好好反思一下呢~ 错的原因如下: 第一次WA:求阶乘的时候忘了递归处理(n/p)! 第二次WA:求阶乘时把p当成循 ...

  8. ACM算法模板整理

    史诗级ACM模板整理 基本语法 字符串函数 istream& getline (char* s, streamsize n ); istream& getline (char* s, ...

  9. $exLucas$学习笔记

    本来不打算写了的,,,但是感$jio$理解起来还是有点儿难度的来着,,,$so$还是瞎写点儿趴$QAQ$ $exLucas$主要有三步: 1)唯一分解$mod$并预处理$p^{k}$以内的阶乘 2)计 ...

随机推荐

  1. Html标签学习笔记二

    1.常用标签 <a></a>超链接    功能    做链接 :在href属性里面写明指向的地方        做下载:href指向文件(注意:不能下载的文件是因为浏览器可以直 ...

  2. 类文件路径一classpath

    classpath作用 指定配置/资源文件的路径 web文件夹层次 src(编译前) main java resources webapp test java resources pom.xml we ...

  3. Flink on YARN(下):常见问题与排查思路

    Flink 支持 Standalone 独立部署和 YARN.Kubernetes.Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛.Flink 社区将推出 Flink ...

  4. 模式识别原理(Pattern Recognition)、概念、系统、特征选择和特征

    §1.1 模式识别的基本概念 一.广义定义 1.模式:一个客观事物的描述,一个可用来仿效的完善的例子. 2.模式识别:按哲学的定义是一个“外部信息到达感觉器官,并被转换成有意义的感觉经验”的过程. 例 ...

  5. 牛客多校第六场 B Shorten IPv6 Address 模拟

    题意: 给你一个二进制表示的IPv6地址,让你把它转换成8组4位的16进制,用冒号分组的表示法.单组的前导0可以省略,连续多组为0的可以用两个冒号替换,但是只允许替换一次.把这个地址通过这几种省略方式 ...

  6. Windbg Step 2 分析程序堆栈实战

    #include "stdafx.h" #include <tchar.h> #ifdef _UNICODE #define _ttol _wtol #else #de ...

  7. HDU-1852-Beijing 2008-一个神奇的公式求逆元

    As we all know, the next Olympic Games will be held in Beijing in 2008. So the year 2008 seems a lit ...

  8. 第二十篇:记下第一个mysql触发器

    项目背景:给一个服务限制访问次数,当用户访问这个服务的次数达到这个值的时候,关闭他的访问权限首先访问信息存在一张表中,记录用户的ip:visitor_ip,服务的id:service_id,访问次数: ...

  9. 使用Math.random()函数生成n到m间的随机数字

    使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数 讲解: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后期的j ...

  10. php 例子

    图片上传 uploadify(flash版是免费的) 12个最好的 HTML5 jQuery 文件上传脚本 20款最好的jQuery文件上传插件