洛谷 P4720 【模板】扩展 / 卢卡斯 模板题
扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720
卢卡斯定理:https://www.luogu.org/problemnew/show/P3807
卢卡斯模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e5;
ll n, m, p, fac[N];
void init()
{
int i;
fac[] =;
for(i =; i <= p; i++)
fac[i] = fac[i-]*i % p;
}
ll q_pow(ll a, ll b)
{
ll ans =;
while(b)
{
if(b &) ans = ans * a % p;
b>>=;
a = a*a % p;
}
return ans;
} ll C(ll n, ll m)
{
if(m > n) return ;
return fac[n]*q_pow(fac[m]*fac[n-m], p-) % p;
} ll Lucas(ll n, ll m )
{
if(m ==) return ;
else return (C(n%p, m%p)*Lucas(n/p, m/p))%p;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%lld%lld%lld", &n, &m, &p);
init();
printf("%lld\n", Lucas(n+m, m));
}
return ;
}
扩展卢卡斯模板
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll; ll read()
{
ll f=,x=;
char ss=getchar();
while(ss<''||ss>''){if(ss=='-')f=-;ss=getchar();}
while(ss>=''&&ss<=''){x=x*+ss-'';ss=getchar();}
return f*x;
} const int maxn=;
ll a[maxn],b[maxn],cnt; ll qpow(ll ai,ll k,ll mod)
{
ll mul=;
while(k>)
{
if(k&)mul=(mul*ai)%mod;
ai=(ai*ai)%mod;
k>>=;
}
return mul;
} ll fac(ll n,ll pi,ll pk)
{
if(!n) return ;
ll mul=; for(ll i=;i<=pk;++i)//分解阶乘第二部分,循环节
if(i%pi)mul=(mul*i)%pk;
mul=qpow(mul,n/pk,pk); for(ll i=;i<=n%pk;++i)//分解阶乘第三部分,求剩余数字
if(i%pi)mul=(mul*i)%pk; return mul*fac(n/pi,pi,pk)%pk;//分解阶乘第一部分的另一个阶乘递归
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==)
{
x=;y=;return;
}
exgcd(b,a%b,x,y);
ll tp=x;
x=y; y=tp-a/b*y;
}
ll inv(ll a,ll b)
{
ll x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
ll C(ll n,ll m,ll pi,ll pk)
{
ll facn=fac(n,pi,pk);//分别求n,m,n-m膜pi^ki的阶乘
ll facm=fac(m,pi,pk);
ll facnm=fac(n-m,pi,pk);
ll kk=;
for(ll i=n;i;i/=pi)kk+=i/pi;//上述分解阶乘第一部分的pi幂次方
for(ll i=m;i;i/=pi)kk-=i/pi;
for(ll i=n-m;i;i/=pi)kk-=i/pi; return facn*inv(facm,pk)%pk*inv(facnm,pk)%pk*qpow(pi,kk,pk)%pk;//注意求逆元
}
void div(ll n,ll m,ll x)
{
for(ll i=;i<=sqrt(x);++i)
{
if(x%i==)
{
ll pi=i,ki=;
while(x%i==)x/=i,ki++;
b[++cnt]=qpow(pi,ki,1e7);
a[cnt]=C(n,m,pi,b[cnt]);//C(n,m)%pi^ki
}
}
if(x>)
b[++cnt]=x,a[cnt]=C(n,m,x,b[cnt]);
} ll exlucas()//china
{
ll ans=,M=,x,y;
for(int i=;i<=cnt;++i) M*=b[i];
for(int i=;i<=cnt;++i)
{
ll tp=M/b[i];
exgcd(tp,b[i],x,y);
x=(x%b[i]+b[i])%b[i];
ans=(ans+tp*x*a[i])%M;
}
return (ans+M)%M;
}
int main()
{
ll n=read(),m=read(),p=read();
div(n,m,p);
printf("%lld",exlucas());
return ;
}
洛谷 P4720 【模板】扩展 / 卢卡斯 模板题的更多相关文章
- 洛谷P4720 【模板】扩展卢卡斯
P4720 [模板]扩展卢卡斯 题目背景 这是一道模板题. 题目描述 求 C(n,m)%P 其中 C 为组合数. 输入输出格式 输入格式: 一行三个整数 n,m,p ,含义由题所述. 输出格式: 一行 ...
- [洛谷P4720] [模板] 扩展卢卡斯
题目传送门 求组合数的时候,如果模数p是质数,可以用卢卡斯定理解决. 但是卢卡斯定理仅仅适用于p是质数的情况. 当p不是质数的时候,我们就需要用扩展卢卡斯求解. 实际上,扩展卢卡斯=快速幂+快速乘+e ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)
[模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...
- 洛谷4525 & 4526:【模板】自适应辛普森法——题解
参考:https://phqghume.github.io/2018/05/19/%E8%87%AA%E9%80%82%E5%BA%94%E8%BE%9B%E6%99%AE%E6%A3%AE%E6%B ...
- 洛谷 P3367 并查集模板
#include<cstdio> using namespace std; int n,m,p; ]; int find(int x) { if(father[x]!=x) father[ ...
- kmp模板 && 扩展kmp模板
kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...
- 【洛谷P3709】大爷的字符串题
看这题网上居然还没人写blog,怕是都去看洛谷自带的了-- 你才是字符串!你全家都是字符串!这题跟字符串没多大关系,只是出题人lxl想要吐槽某中学而已--... 其实这题说白了就是问区间里出现最多的数 ...
- 洛谷P1072 [NOIP2009] Hankson 的趣味题
P1072 Hankson 的趣味题 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一 ...
随机推荐
- bt设置指定的ip地址
auto eth0 iface eth0 inet staticaddress 192.168.1.112 IP地址netmask 255.255.255.0 子网掩码network 192.168. ...
- COGS 1743. 忠诚
★ 输入文件:faithful.in 输出文件:faithful.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 老管家是一个聪明能干的人.他为财主工作了整整1 ...
- Outlook 数据文件(.pst 和 .ost)简介
使用 Microsoft Outlook 时,电子邮件.日历.任务和其他项目保存在邮件服务器或计算机上,或者同时保存在这两个位置.如果 Outlook 项目保存在计算机上,则它们保存在 Outlook ...
- 程序员面试系列之Java单例模式的攻击与防御
我写的程序员面试系列 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java ...
- String系列之replaceAll方法替换.
直接使用String类的replaceall方法的第一个参数并不是简单的字符串,而是一个正则表达式.在正则表达式中,英文点号(.)表示任意字符,所以你原先的写法会把所有字符都替换成空白. 转义使用所以 ...
- MPP(大规模并行处理)简介
1. 什么是MPP? MPP (Massively Parallel Processing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和 ...
- Perl 安装 JSON 包
$tar xvfz JSON.tar.gz $cd JSON $perl Makefile.PL $make $make install
- HLS协议详解
1. HLS HLS是为移动设备开发的基于HTTP的流媒体解决方案. 2. 原理: 将视频或流切分成小片(TS), 并建立索引(M3U8). 支持视频流:H.264: 音频流:AAC 3. M3U8文 ...
- Day01:我的Python学习之路
1.Python是什么语言? Python是动态的解释性的强类型定义的语言. (1)动态语言与静态语言 ①静态语言:在编译期间就会去做数据类型检查的语言,如C,C++. ②动态语言:在运行期间才会去做 ...
- HDU - 5438 Ponds(拓扑排序删点+并查集判断连通分量)
题目: 给出一个无向图,将图中度数小于等于1的点删掉,并删掉与他相连的点,直到不能在删为止,然后判断图中的各个连通分量,如果这个连通分量里边的点的个数是奇数,就把这些点的权值求和. 思路: 先用拓扑排 ...