洛谷 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 正在思考一 ...
随机推荐
- Azure PowerShell 在ARM环境下使用指定 vhd(本地化后的磁盘) 来创建虚拟机
#此脚本用于 Azure 存储账户中已有 vhd 镜像文件创建虚拟机,一般用于做好镜像测试 #----------------------------------------------------- ...
- Understanding Scroll Views 深入理解 scroll view 读书笔记
Understanding Scroll Views 深入理解 scroll view 读书笔记 It may be hard to believe, but a UIScrollView is ...
- Javaweb学习笔记5—Cookie&Session
今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的 ...
- Redis杂谈
这是2015年初应邀在南华智闻作技术交流时所作的Redis方面的一个presentation. 因为原件是Keynote格式,已经转成PDF,点击下面链接打开或者下载PDF: Redis 杂谈
- 图形学基础 | 实现OBJ文件的载入
1. tiny_obj_loader.h 的使用include这个头文件需要先定义一个宏 #define TINYOBJLOADER_IMPLEMENTATION#include "tiny ...
- python_对字符串操作.join() 效率 比 + 效率高
将列表中的字符拼接成字符串时,有两种方式 方式1:使用join()方法,将列表转为字符串 方式2:使用+运算符,循环遍历 import time str1 = ['a','b','c','d','e' ...
- @click.native 会触发原生 click事件 vue
@click.native 会触发原生 click事件 vue
- luogu P3393 逃离僵尸岛-搜索剪枝+spfa
P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...
- 深入Linux内核架构——进程虚拟内存
逆向映射(reverse mapping)技术有助于从虚拟内存页跟踪到对应的物理内存页: 缺页处理(page fault handling)允许从块设备按需读取数据填充虚拟地址空间. 一.简介 用户虚 ...
- oslo.messaging
oslo.messaging oslo.messaging库为OpenStack各个项目使用RPC和事件通知(Event Notification)提供了一套统一的接口.代码库位于https://gi ...