1. 程式人生 > >一些數論知識點

一些數論知識點

階乘 class mage 剩余定理 中國 con 知識 turn pmod

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; }

中國剩余定理:

技術分享

一些數論知識點