洛谷 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 正在思考一 ...
随机推荐
- 微信小程序开发系列二:微信小程序的视图设计
大家如果跟着我第一篇文章 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 一起动手,那么微信小程序的开发环境一定搭好了.效果就是能把该小程序的体验版以二维码的方式发送给其他朋友使用. 这个系列 ...
- 11gR2新特性---gipc守护进程
在这篇文章中,我们会对11gR2 新的守护进程gipcd(资源名称ora.gipcd)进行介绍,其中包括gipc的功能,启动顺序和一些基本的测试. 我们知道,对于oracle集群来说,集群私网是非常重 ...
- dialog - 从 shell 显示对话框
总览 (SYNOPSIS) dialog --clear dialog --create-rc file dialog --print-maxsize dialog common-options bo ...
- Java数据结构和算法(四)--链表
日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...
- qobject_cast
void QLadderDiagramItem::GetMainForm(DoType sourceType){ for each (QWidget *w in qApp->topLevelWi ...
- Oracle清空数据库中数据表数据的方法
一.简介最近在项目发版测试的时候,导出dmp的时候不小心把开发库中的一些脏数据导出来了,测试那边导入进去之后一堆不规范的数据,为了不影响测试结果,于是总结了一个快速清空数据库数据表所有数据的方法. 二 ...
- ibatis经验
1.insert,update,delete 返回值(1).insert 返回的为插入的主键值,但必须在配置文件中加入<selectKey/> 如果主键值为String<sele ...
- luogu P3353 在你窗外闪耀的星星
问题:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置Xi和自身的亮度Bi.而窗户所能看到的范围是一个给出的参数W,我们看到的星星也包括窗户边缘的星星.现在,要你求出调整 ...
- dll加载遇到的问题
dll加载有两种形式,分别是隐式加载和显式加载. 隐式加载在编译的时候就将dll文件编译到可执行文件中去,程序发布的时候可以不用讲dll带着.缺点是,这样编译出来后,程序会很大. 显式加载是指在程序运 ...
- 用python代码玩微信
# 安装包 pip install -U wxpy from wxpy import * import time import json bot=Bot() my_friend = bot.frien ...