洛谷P4720 【模板】扩展卢卡斯
P4720 【模板】扩展卢卡斯
题目背景
这是一道模板题。
题目描述
求
C(n,m)%P
其中 C 为组合数。
输入输出格式
输入格式:
一行三个整数 n,m,p ,含义由题所述。
输出格式:
一行一个整数,表示答案。
输入输出样例
5 3 3
1
666 233 123456
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 【模板】扩展卢卡斯的更多相关文章
- [洛谷P4720] [模板] 扩展卢卡斯
题目传送门 求组合数的时候,如果模数p是质数,可以用卢卡斯定理解决. 但是卢卡斯定理仅仅适用于p是质数的情况. 当p不是质数的时候,我们就需要用扩展卢卡斯求解. 实际上,扩展卢卡斯=快速幂+快速乘+e ...
- [洛谷P4777] [模板] 扩展中国剩余定理
扩展中国剩余定理,EXCRT. 题目传送门 重温一下中国剩余定理. 中国剩余定理常被用来解线性同余方程组: x≡a[1] (mod m[1]) x≡a[2] (mod m[2]) ...... x≡a ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题
扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
随机推荐
- Python2.7-fractions
fractions 模块,提供分数格式存储数据,没多大用处,除了模块里的最大公约数函数 gcd(a,b) 模块类和方法: fractions.Fraction(numerator=0, denomin ...
- TM1629A驱动程序
网上看了很多1629驱动程序,很乱,下载了几个整合了一下,下面的程序还没有烧录到开发板里面测试,程序已经做好了,但是这个方案老板不做了,所以只能在这里放着了,留着以后用吧 void TM1629A_W ...
- HTTP请求header信息讲解
HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成.HTTP的头域包括通用头,请求头,响应头和 ...
- Exp7
实验内容 简单应用SET工具建立冒名网站 kali IP: 192.168.1.160 (原198) win7 IP: 192.168.1.199 1.开启本机Apache服务 (1)查看80端口是否 ...
- 汇编 ADD指令
知识点: 加法汇编指令ADD 一.加法指令 ADD(Addition) 格式 格式: ADD A,B //A=A+B; 功能: 两数相加 . OPRD1为任一通用寄存器或存储器操作数,可以是任意一个 ...
- pygame 入门实例
本文基于win7(64) + py3.5(64)环境. 本文是这里的一篇学习笔记.加入了自己的理解. 本文最终目的是实现一个飞机躲避导弹的游戏. 1.核心概念 pygame 的核心概念有: Surfa ...
- BZOJ1000-1099板刷计划(附题解链接)
BZOJ1000-1099板刷计划 感觉完全做不动啊... \(Orz\) \(M\_sea\)板刷bzoj狂魔 1000 - 1009 1000 ...懒得说了 1001 懒得平面图转对偶图,最小割 ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- [arc102E]Stop. Otherwise...[容斥+二项式定理]
题意 给你 \(n\) 个完全相同骰子,每个骰子有 \(k\) 个面,分别标有 \(1\) 到 \(k\) 的所有整数.对于\([2,2k]\) 中的每一个数 \(x\) 求出有多少种方案满足任意两个 ...
- UWP简单示例(一):快速合成音乐MV
说明 本文发布时间较早,内容可能已过时.最新动态请关注 TypeScript 版本.(2019 年 3 月 注) 在线演示: 音频可视化(TypeScript) 准备 IDE:Visual Studi ...