洛谷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即可 注意处理进位 ...
随机推荐
- ROS launch 文件的编写
ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题解决
出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock时,先用tail -5f /var/log/upstart/do ...
- 20155226 《网络对抗》Exp9 Web安全基础
20155226 <网络对抗>Exp9 Web安全基础 实践过程 开启webgoat 输入java -jar webgoat-container-7.1-exec.jar 在浏览器输入lo ...
- 20155232《网络对抗》Exp5 MSF基础应用
20155232<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit:就是利用可能存在的漏洞对目标进行攻击 ...
- VS相关
快速显示函数名称 ctrl+alt+T 显示函数参数说明 ctrl+shift+space,光标放在函数里面 link 1123错误,vs2010的问题. 点击工程-属性-ManifestTool-I ...
- win7笔记本VirtualBox安装黑苹果MacOS 10.13
环境 时间:2018.04.09,没有指明时间的教程都是耍流氓 笔记本:某州优雅A460P-i7G D2,4G内存,Intel Core i7-2670QM四核八线程(老笔记本勉强能用),ssd硬盘, ...
- 【ORACLE】oracle11g RAC搭建
--安装好操作系统(rhel-server-6.7 on vmware) 注意事项: 1.磁盘配置lvm 2.账号密码 root/oracle ---------------------------- ...
- shell脚本之基础
配置启动界面 vim /etc/inittab/ init3配置网卡 重启生效system-config-network网卡配置文件vim /etc/sysconfig/network-script ...
- 关于hive的优化
首先hive本质就是mapreduce,那么优化就从mapreduce开始入手. 然而mapreduce的执行快慢又和map和reduce的个数有关,所以我们先从这里下手,调整并发度. 关于map的优 ...
- GitHub 新手教程 二,Windows 版 GitHub 安装
1,下载地址: https://git-scm.com/download/ 2,信息: 3,选择安装位置: 例如:d:\soft\git 4,选择组件: 5,创建开始菜单: 6,选择Git使用的默认编 ...