一些数论知识点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些数论知识点相关的知识,希望对你有一定的参考价值。
Lucas定理:
$C_{b}^{a}\\pmod p= C_{b/p}^{a/p}*C_{b \\pmod p}^{a \\pmod p}\\pmod p$
通常在p较小时用。
对于$C_{b/p}^{a/p}$,递归计算,
对于$C_{b \\pmod p}^{a \\pmod p}$,通过预处理阶乘和阶乘的逆元求。
至于证明。。我也不会。
模板:洛谷3807
#include<cstdio> const int maxn=100000; typedef long long ll; ll fac[maxn+10],invfac[maxn+10]; ll fpow(ll a,ll b,ll p){ ll ans=1; for(;b;b>>=1,a=a*a%p) if(b&1) ans=ans*a%p; return ans; } ll prework(ll p){ fac[0]=invfac[0]=1; for(int i=1;i<=maxn;++i){ fac[i]=fac[i-1]*i%p; invfac[i]=fpow(fac[i],p-2,p); } } ll c(ll a,ll b,ll p){ if(a>b) return 0; return fac[b]*invfac[a]%p*invfac[b-a]%p; } ll lucas(ll a,ll b,ll p){ if(!a) return 1; return lucas(a/p,b/p,p)*c(a%p,b%p,p)%p; } ll t,a,b,p; int main(){ scanf("%lld",&t); for(;t--;){ scanf("%lld%lld%lld",&a,&b,&p); prework(p); printf("%lld\\n",lucas(b,a+b,p)); } return 0; }
中国剩余定理:
以上是关于一些数论知识点的主要内容,如果未能解决你的问题,请参考以下文章