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 < ...
随机推荐
- JavaScript中闭包的使用和各种继承介绍
一.什么是闭包? (1)闭包的概念:a.闭包就是函数嵌套时,让局部变量变成自由变量的环境,是一种让局部变量进化的方式. b.定义在一个函数内部的函数. ...
- Vue躬行记(2)——指令
Vue不仅内置了各类指令,包括条件渲染.事件处理等,还能注册自定义指令. 一.条件渲染 条件渲染的指令包括v-if.v-else.v-else-if和v-show. 1)v-if 该指令的功能和条件语 ...
- C# 8 - Range 和 Index(范围和索引)
C# 7 的 Span C# 7 里面出现了Span这个数据类型,它可以表示另一个数据结构里连续相邻的一串数据,并且它是内存安全的. 例子: 这个图的输出是3,4,5,6. C# 8 的Range类型 ...
- SQL创建和调用有默认值的存储过程
先创建一个有默认值的存储过程 create procedure usp_unpass ), --有默认值的参数放到最后 as select @score go 该存储过程有2个参数 ,其中@score ...
- 基于常规DNS隧道进行的tcp端口转发dns2tcp的使用
0x01 安装Dns2TCP dns2tcp 是一个利用DNS隧道转发TCP连接的工具,使用C语言开发. sudo apt-get install dns2tcp 0x02配置dns2tcp 配置DN ...
- Codeforces 986B - Petr and Permutations
Description\text{Description}Description Given an array a[], swap random 2 number of them for 3n or ...
- wait,notify,notifyAll详细介绍
https://www.cnblogs.com/pangyang/articles/5916349.html
- Hello World ! 节日快乐!
节日快乐! 世界你好,Hello World Java public class HelloWorld{ public static void main(String[] args) { System ...
- php函数分为哪两种?
PHP的真正威力源自于它的函数.函数分为内置函数和自定义函数. 内置函数 所谓PHP内置函数,就是在php程序的库里面已经定义了的函数,比如echo,mysql_connect,include_onc ...
- webpack 打包 todolist 应用
写在前面的话: 一直想着手动配置webpack实现应用,正好最近这段时间比较空闲,就写了一个通过webpack打包实现todolist的简单应用.本文内容包括:通过webpack打包css,html ...