P4720 【模板】扩展卢卡斯

题目背景

这是一道模板题。

题目描述

C(n,m)%P

其中 C 为组合数。

输入输出格式

输入格式:

一行三个整数 n,m,p ,含义由题所述。

输出格式:

一行一个整数,表示答案。

输入输出样例

输入样例#1:

5 3 3
输出样例#1:

1
输入样例#2:

666 233 123456
输出样例#2:

61728

说明

1≤m≤n≤1018,2≤p≤1000000 ,不保证 p 是质数。

sol:ExLucas模板 可以做P不是质数的组合数

具体方法简单说下:把P分成若干个质因数的幂次的乘机,分别求出那时候的组合数,用Exgcd合并起来即可

口胡一下怎么快速求n!

假定n=19,模数为32

n!=1∗2∗3∗⋯∗19

=(1*2*4*5*7*8*10*11*13*14*16*17*19)*36*6!

≡(1∗2∗4∗5∗7∗8)2∗19∗36∗6!

然后对于1*2*4*5*7*8和19这两段长度不超过32暴力求解,6!递归求解,另一团快速幂。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
ll n,m;
ll cnt=,Mo[N],Yu[N];
ll prim[N],T[N]; inline void Exgcd(ll a,ll b,ll &X,ll &Y);
inline ll Solve();
inline ll Ksm(ll x,ll y,ll Mod);
inline ll Inv(ll Num,ll Mod);
inline ll Jiecheng(ll n,ll P,ll Pk);
inline ll C(ll n,ll m,ll P,ll Pk);
inline ll CRT(ll Num,ll Mod,ll Pk);
inline ll ExLucas(ll n,ll m,ll Mod); inline ll Ksm(ll x,ll y,ll Mod)
{
ll ans=;
while(y)
{
if(y&) ans=ans*x%Mod;
x=x*x%Mod;
y>>=;
}
return ans;
}
inline void Exgcd(ll a,ll b,ll &X,ll &Y)
{
if(b==)
{
X=;
Y=;
return;
}
Exgcd(b,a%b,X,Y);
ll XX=X,YY=Y;
X=YY;
Y=XX-a/b*YY;
return;
}
inline ll Inv(ll Num,ll Mod) //Num*Inv = 1(%Mod)
{
ll a,b,X,Y;
a=Num;
b=Mod;
Exgcd(a,b,X=,Y=);
X=(X%b+b)%b;
return X;
}
inline ll Jiecheng(ll n,ll P,ll Pk)
{
if(!n) return ;
ll i,ans=;
for(i=;i<=Pk;i++) if(i%P) ans=ans*i%Pk;
ans=Ksm(ans,n/Pk,Pk);
for(i=;i<=n%Pk;i++) if(i%P) ans=ans*i%Pk;
return ans*Jiecheng(n/P,P,Pk)%Pk;
}
inline ll C(ll n,ll m,ll P,ll Pk)
{
ll Jn=Jiecheng(n,P,Pk);
ll Jm=Jiecheng(m,P,Pk);
ll Jnm=Jiecheng(n-m,P,Pk);
ll i,oo=;
for(i=n;i;i/=P) oo+=i/P;
for(i=m;i;i/=P) oo-=i/P;
for(i=n-m;i;i/=P) oo-=i/P;
return Jn*Ksm(P,oo,Pk)%Pk*Inv(Jm,Pk)%Pk*Inv(Jnm,Pk)%Pk%Pk;
}
inline ll ExLucas(ll n,ll m,ll Mod)
{
ll i,ans=,tmp=Mod;
for(i=;i<=sqrt(tmp);i++) if(tmp%i==)
{
ll Num=;
while(tmp%i==)
{
Num*=i;
tmp/=i;
}
Mo[++cnt]=Num;
Yu[cnt]=C(n,m,i,Num);
}
if(tmp>)
{
Mo[++cnt]=tmp;
Yu[cnt]=C(n,m,tmp,tmp);
}
return Solve();
}
inline ll Solve()
{
memmove(prim,Mo,sizeof Mo);
memmove(T,Yu,sizeof T);
int i;
ll Lcm=prim[];
for(i=;i<=cnt;i++)
{
ll a=prim[i-],b=prim[i],c=T[i]-T[i-],r=,X,Y;
Exgcd(a,b,X=,Y=);
ll tmp=b/r;
X=(X*c%tmp+tmp)%tmp;
prim[i]=Lcm=Lcm*prim[i];
T[i]=X*prim[i-]+T[i-];
}
return T[cnt];
}
int main()
{
int i,Mod;
R(n); R(m); R(Mod);
Wl(ExLucas(n,m,Mod));
return ;
}
/*
input
5 3 3
output
1 input
666 233 123456
output
61728
*/

洛谷P4720 【模板】扩展卢卡斯的更多相关文章

  1. [洛谷P4720] [模板] 扩展卢卡斯

    题目传送门 求组合数的时候,如果模数p是质数,可以用卢卡斯定理解决. 但是卢卡斯定理仅仅适用于p是质数的情况. 当p不是质数的时候,我们就需要用扩展卢卡斯求解. 实际上,扩展卢卡斯=快速幂+快速乘+e ...

  2. [洛谷P4777] [模板] 扩展中国剩余定理

    扩展中国剩余定理,EXCRT. 题目传送门 重温一下中国剩余定理. 中国剩余定理常被用来解线性同余方程组: x≡a[1] (mod m[1]) x≡a[2] (mod m[2]) ...... x≡a ...

  3. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

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

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

  5. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  6. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  7. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  8. 洛谷-P5357-【模板】AC自动机(二次加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...

  9. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

随机推荐

  1. Python2.7-bisect

    bisect 模块,对已经排好序的序列进行筛选,添加新元素,效率高,不用在插入新元素后重新排序,可以快速找到小于指定值的位置 个人想法:与 heapq 的堆可以较好的结合使用 模块方法:bisect_ ...

  2. Vue购物车

    index.html <!DOCTYPE html><html>    <head>        <meta charset="utf-8&quo ...

  3. jqgrid 获取远端数据失败时,弹出错误提示

    有时,我们给jqgrid绑定的远端数据获取失败,此时,需要把错误信息反馈给用户展示,如何实现? 可通过jqgrid的 loadError 来处理错误数据的返回.详细如下: $("#jqGri ...

  4. php中addslashes(),htmlspecialchars()

    参考转自http://czf2008700.blog.163.com/blog/static/2397283200937103250194/ addslashes -- 使用反斜线引用字符串 stri ...

  5. CAN设计与应用指南

    CAN设计与应用指南 0.前言 这是我为公司写的一个关于CAN总线的入门文章,对全面理解CAN总线特性很有帮助,拿出来分享给大家. 1. 简介 CAN总线由德国BOSCH公司开发,最高速率可达到1Mb ...

  6. HUE配置HIVE

    HIVE配置 修改hue.ini配置文件 [beeswax] hive_server_host=node1 hive_server_port= hive_conf_dir=/usr/hive-/con ...

  7. springboot mybatis 后台框架平台 集成代码生成器 shiro 权限

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  8. WPF的Style的TargetType不同写法的异同

    原文:WPF的Style的TargetType不同写法的异同 <Style TargetType="TextBlock"> <Setter Property=&q ...

  9. 执行力:Just Do It

    执行力,最最关键的一点就是,立即去做,不要想太多. 当有一件事需要去做的时候,你的大脑肯定是接受到了"某种信号",比如来了一个灵感.受到一点启发.做某件事突然来了兴趣.或者想去探讨 ...

  10. [Oracle]坏块处理:确认坏块的对象

    如果已经知道 FILE#,BLOCK#,则 可以通过如下查询来看: SQL> SELECT SEGMENT_TYPE,OWNER||'.'||SEGMENT_NAME FROM DBA_EXTE ...