lucas定理(模板题题解)
题目很简单,很暴力,就是组合数,没有其他的。
但是直接暴力会炸wow
我们可以利用Lucas定理来分解字问题。
Lucas定理:C(n,m)(mod p)=C(n%p,m%p)*C(n/p,m/p)(mod p);
所以,我们可以把这个题目分解成子问题:
C(n,m+n)(mod p)=C(n%p,m+n%p)*C(n/p,(m+n)/p);
而第二个C又可以用Lucas定理求,
所以可以递归求解了
当m=0时,Lucas返回1(C(n,0)=1)
但是,还是要注意:
这题要逆元!!!
这题要逆元!!!
这题要逆元!!!
因为组合要除法,所以需要逆元。
还好题目亲切,p一定是质数,所以直接费马小搞定了。
于是:O(n)处理阶乘,logn处理逆元(卡速米)lognLucas
所以整体复杂度应该是O(Tnlog^2n )(应该不太对)
贴代码,有些注意事项在代码里写出来
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+;
long long n,m,p;
long long ksm(long long a,long long b)
{
a%=p;
long long res=;
while(b)
{
if(b%==)
res=(res*a)%p;
a=(a*a)%p;
b>>=;
}
return res;
}
long long fac[maxn];
long long C(long long a,long long b)
{
if(a<b)//坑点,如果总数小于方案数(C(n,m)n<m,也就是选不出来)要跳出
return ;
return (fac[a]*ksm(fac[b],p-))%p*ksm(fac[a-b],p-)%p;//逆元乘法,求组合数
} long long lucas(long long a,long long b)
{
if(b==)
return ;
return lucas(a/p,b/p)*C(a%p,b%p)%p;//Lucas表达
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&m,&p);
fac[]=;//阶乘
for(long long i=;i<=p;i++)
{
fac[i]=(fac[i-]*i)%p;//阶乘
}
printf("%lld\n",lucas(n+m,n));//跑Lucas
}
return ;
}
(完)
lucas定理(模板题题解)的更多相关文章
- HDU 3037 Saving Beans(Lucas定理模板题)
Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数
typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...
- Lucas定理模板【bzoj2982】【combination】
(上不了p站我要死了,侵权度娘背锅) Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ ...
- BZOJ 4403 2982 Lucas定理模板
思路: Lucas定理的模板题.. 4403 //By SiriusRen #include <cstdio> using namespace std; ; #define int lon ...
- lucas定理 模板
lucas定理 (nm) mod p=(⌊np⌋⌊mp⌋)(n mod&VeryTh ...
- 【组合数+Lucas定理模板】HDU 3037 Saving
acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...
- poj 1430 Binary Stirling Number 求斯特林数奇偶性 数形结合| 斯特林数奇偶性与组合数的关系+lucas定理 好题
题目大意 求子集斯特林数\(\left\{\begin{matrix}n\\m\end{matrix}\right\}\%2\) 方法1 数形结合 推荐一篇超棒的博客by Sdchr 就是根据斯特林的 ...
- Lucas定理模板
用于大组合数对p取模的计算. #include <cstdio> #include <iostream> #include <cmath> #include < ...
随机推荐
- ES(Elastic Search)update操作设置无 docment时进行insert
最近使用一套数据加工中间工具,查看es操作中的update操作.其中方法命名为updateOrInsert.但是没发现代码中有ES的insert方法调用.于是仔细分析了代码逻辑. 经过一路追溯,直至E ...
- display:none和visibility:hidden的区别?
css控制元素不可见的方法 { display: none; /* 不占据空间,无法点击 */ } /************************************************* ...
- sublime text2解决中文乱码,支持中文的设置方法
步骤: 1.安装Sublime Package Control. 在Sublime Text 2上用Ctrl+-打开控制台并在里面输入以下代码,Sublime Text 2就会自动安装P ...
- MQTT介绍与使用
物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段.其英文名称是:“Internet of things(IoT)”.顾名思义,物联网就是物物相连的互联网.这有两层意思:其一,物联 ...
- css父元素透明度(opacity)对子元素的影响
首先子元素会继承父元素的透明度: 设置父元素opacity:0.5,子元素不设置opacity,子元素会受到父元素opacity的影响,也会有0.5的透明度. 其次子元素的透明度是基于父元素的透明度计 ...
- mysql的十二条基本语句
在 mysql里,所有语句都以分号作为结束标志! 1.连接服务器 Mysql -u username -p passwd 2.当连上服务器后,首先面对的是库,库有1个或多个,因此我们想对表进行操作的话 ...
- 渗透-N种反弹shell方法
简介 reverse shell反弹shell或者说反向shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端.reverse shell与teln ...
- 渗透测试-基于白名单执行payload--Regsvr32
复现亮神课程 基于白名单执行payload--Regsvr32 0x01 Regsvr32 Regsvr32命令用于注册COM组件,是 Windows 系统提供的用来向系统注册控件或者卸载控件的命令, ...
- js中submit和button的区别
今天写一个js验证 遇到点小坑 记录一下 button-普通按钮,submit-提交按钮. submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和bu ...
- Echart:前端很好的数据图表展现工具+demo
官网: http://echarts.baidu.com/index.html 通过一个简单的小Demo介绍echart的使用:demo均亲测可以运行 demo1: 1.新建一个echarts.ht ...