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. Java学习笔记--Java开发坏境搭建

    一.安装JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 根据自己系统选择 ...

  2. FPGA按一下按键,对应端口输出单个脉冲

    对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想 module state(key,led,clk); input ...

  3. Can't create component 'xxx.xxx.xxx' as it has dependencies to be satisfied

    问题描述: Can't create component 'xxx.xxx.xxx' as it has dependencies to be satisfied. 问题原由: 没有对新建的实体映射类 ...

  4. 配置Docker镜像加速器

    由于在国内下载docker官方镜像的速度很慢且容易报错,因此需要配置docker镜像加速器来解决这个问题,加速器就是镜像代理的概念,只代理公有镜像,报错结果如下: net/http: request ...

  5. 20155204 王昊《网络对抗技术》EXP3

    20155204 王昊<网络对抗技术>EXP3 一.基础问题回答 1.杀软是如何检测出恶意代码的? 答: 基于特征码:一段特征码就是一段或多段数据.(如果一个可执行文件(或其他运行的库.脚 ...

  6. 20155310《网络对抗》Exp2 后门原理与实践

    20155310<网络对抗>Exp2 后门原理与实践 基础问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? 在网上下载软件的时候,后门很有可能被捆绑在下载的软件当中: 浏览网 ...

  7. 【转】从Shell脚本内部将所有标准输出及标准错误显示在屏幕并同时写入文件的方法

    如果全部都要重定向的话每一条命令后面>>并不方便,可以这么做.在开头就声明 exec 1>>$log_file表示将脚本中所有的正确输出全部追加到$log_file,错误信息会 ...

  8. mfc 重载赋值运算符

    重载赋值运算符= 一.重载运算符格式 返回类型 operator 运算符 (参数); 如: bool operator=(char*s); int operator>(char*s); bool ...

  9. mysql提示Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist解决方法

    一次重启mysql发现无法启动成功,通过检查mysql日志发现问题并解决了问题. mysql启动失败的日志: [root@nn ~]# tail -n 20 /var/log/mysqld.log 1 ...

  10. GIT命令基本使用

    记录摘选自廖雪峰的官方网站归纳总结 1.centos下安装git [root@cdw-lj ~]# yum install git 2.配置用户名以及邮箱 [root@cdw-lj opt]# git ...