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 < ...
随机推荐
- django的url分发封装
h2, body>h3, body>h4, body>h1{ padding: 10px; background-color: #4cae4c; text-align: center ...
- VPGAME 的 Kubernetes 迁移实践
作者 | 伍冲斌 VPGAME 运维开发工程师 导读:VPGAME 是集赛事运营.媒体资讯.大数据分析.玩家社群.游戏周边等为一体的综合电竞服务平台.总部位于中国杭州,在上海和美国西雅图分别设立了电 ...
- [CF85E] Guard Towers - 二分+二分图
题目描述 In a far away kingdom lives a very greedy king. To defend his land, he built n n n guard towers ...
- LInux下npm install 安装失败问题
现象: 今天公司自己动部署的Jenkins出现了问题,在执行npm install的时候,失败了,下载不到npm,在查阅了各种报错信息之后还是没有解决,发现用淘宝镜像进行安装时,也会有安装不成功的情况 ...
- 图像处理笔记(二十一):halcon在图像处理中的运用
概要: 分水岭算法做图像分割 二维码识别 稍后将其他几篇笔记全都补充上概要方便查询. 分水岭算法做图像分割 使用距离变换结合分水岭算法实现图像分割,可以用来分割仅通过阈值分割还是有边缘连接在一起的情况 ...
- Linux本地内核提权漏洞复现(CVE-2019-13272)
Linux本地内核提权漏洞复现(CVE-2019-13272) 一.漏洞描述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_c ...
- LeetCode122——Best Time to Buy and Sell Stock II
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- 不离开Emacs完成简单程序的编辑编译运行(windows或Linux)
(1)打开Emacs (2)建立一个新的程序文件. 执行 C-x C-f, 然后在屏幕的底部出现minibuffer,光标提示你输入文件名称, 文件名称要带上后缀名,如hello.cpp.回车,然后开 ...
- navicat cannot load oci dll||oracle 改字符集为GBK后 navicat 连不上||Ora-28547 ora net错误
此段适用于 解决 navicat cannot load oci dll 环境 Navicat Premium 和 oracle 原因,navicat 32 和64 都只支持 32位的oci.dll ...
- Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)
一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...