模板:exlucas
求$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的更多相关文章
- NOIP模板总结
NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...
- 洛谷P4720 【模板】扩展卢卡斯
P4720 [模板]扩展卢卡斯 题目背景 这是一道模板题. 题目描述 求 C(n,m)%P 其中 C 为组合数. 输入输出格式 输入格式: 一行三个整数 n,m,p ,含义由题所述. 输出格式: 一行 ...
- exLucas学习笔记
exLucas学习笔记 Tags:数学 写下抛硬币和超能粒子炮改 洛谷模板代码如下 #include<iostream> #define ll long long using namesp ...
- 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题
扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...
- 【知识总结】扩展卢卡斯定理(exLucas)
扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...
- 【模板整合计划】NB数论
[模板整合计划]NB数论 一:[质数] 1.[暴力判] 素数.コンテスト.素数 \(\text{[AT807]}\) #include<cstdio> #include<cmath& ...
- exlucas易错反思
模板和题解 复习了一下 exlucas的模板,结果写挂四次(都没脸说自己以前写过 是该好好反思一下呢~ 错的原因如下: 第一次WA:求阶乘的时候忘了递归处理(n/p)! 第二次WA:求阶乘时把p当成循 ...
- ACM算法模板整理
史诗级ACM模板整理 基本语法 字符串函数 istream& getline (char* s, streamsize n ); istream& getline (char* s, ...
- $exLucas$学习笔记
本来不打算写了的,,,但是感$jio$理解起来还是有点儿难度的来着,,,$so$还是瞎写点儿趴$QAQ$ $exLucas$主要有三步: 1)唯一分解$mod$并预处理$p^{k}$以内的阶乘 2)计 ...
随机推荐
- Windows del
删除一个或数个文件. DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] namesERASE [/P] [/F] [/S] [/Q] [/A[[:]attribu ...
- DP杂题2
1.邦邦的大合唱站队 https://www.luogu.org/problem/show?pid=3694 XY说这是道简单的签到题,然后我大概是普及组都拿不到三等的那种了.. 插入题解.写得太好了 ...
- 微信sdk 隐藏右上角菜单项
wx.ready(function () { // 8.3 批量隐藏菜单项 wx.hideMenuItems({ menuList: [ 'menuItem:share:qq', //分享到QQ 'm ...
- 二分查找总结及部分Lintcode题目分析 3
Search in rotated sorted array,题目中也给出了相应的例子,就是在sorted array某个节点发生了翻转(ie.0 1 2 4 5 6 7 might become 4 ...
- (37)C#Linq
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/let-clause 一.定义 Linq(Lang ...
- redis服务后台运行
文章目录 进入redis的安装目录 查看目录结构 进入src目录,普通启动效果 编辑redis服务目录下的redis.conf 进入src目录,执行后台运行的命令 检查服务是否开启 进入redis的安 ...
- 微信小程序 主题皮肤切换(switch开关)
示例效果: 功能点分析: 1.点击switch开关,切换主题皮肤(包括标题栏.底部tabBar):2.把皮肤设置保存到全局变量,在访问其它页面时也能有效果3.把设置保存到本地,退出应用再进来时,依然加 ...
- 4_1.springboot2.xWeb开发使用thymeleaf
1.简介 如果使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来: ...
- Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1
Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...
- POJ 1873 /// 状压+凸包
题目大意: 国王有一片森林,巫师需要从所有树中选出一些做成围栏把其他树围起来, 每棵树都有其对应的价值 v 和能作为围栏的长度 l 要求最小价值,若存在多种最小价值的方案则选择余下长度更少的 树木较少 ...