洛谷P3807卢卡斯定理
九月 05, 2021
这是一道模板题
这里是题目 洛谷P3807
卢卡斯定理及题目的阐释
卢卡斯定理是用来解决一大很大的组合数来和一个质数求余的问题,它的定义如下
如果$p$为素数,设$n=sp+q$,$m=tp+r$
则:
$$
C^{sp+q}_{tp+r}\equiv C^s_t*C^q_r(mod\ p)
$$
那么来看看题。
首先看这个数据范围,就知道可以用int的类型解决个屁,就是int害的我错了好多次long long 的数据类型解决,这个数据看起来好像是只有 10的5次方,但是中间这么多的计算,突然的就给我溢出了我靠着ZFN大佬的数据测试发现负数才发现的。
1 | long long C(int n,int m,int p){ |
这一段是求组合的函数,拿出来单独讲一讲
因为这里面的参数传过来的时候都是已经和p求过余了的,而且p在题目中说了的,是一个质数所以说这里的$n$,$m$都是和$p$互质的。
因为公式里面要除掉$m!$,同时有要去对p取模,所以考虑用它的逆元乘来代替用它来除
而根据费马小定理可以知道它的逆元是它的$p-2$方
Code
那么综上,加上以个快速幂就可以解出这道题了
1 | //洛谷P3807 Lucas 模板题 |
查看评论