P3807 模板 盧卡斯定理

2022-02-27 10:47:57 字數 2426 閱讀 1536

題解大部分都是遞迴實現的,給出一種非遞迴的形式

話說上課老師講的時候沒給**,然後自己些就寫成了這樣

對於質數\(p\)給出盧卡斯定理:

\[\tbinom=\tbinom\tbinom\rfloor} \rfloor}\pmod p

\]其實它還有另一種形式,雖然本質上沒啥區別:

\[\tbinom=\prod_^k \tbinom \pmod p

\]其中,\(a,b\)分別為\(n,m\)的\(p\)進製下的每一位,\(k\)是它們位數的較大值,當然如果有數不足\(k\)位,要補前導0

來證明一下

其實證明方法也是看了別人blog才知道的

設\(s=\lfloor \dfrac\rfloor,t=\lfloor \dfrac\rfloor\)

則有\(q,w\)使得\(n=sp+q,m=tp+w\)

再考慮乙個二項式:

\[(1+x)^n=((1+x)^p)^s(1+x)^q

\]先由費馬小定理推個結論:

\[x^p\equiv x\pmod p \rightarrow (x^p+1)\equiv (x+1)\pmod p

\]\[(x+1)^p\equiv (x+1)\pmod p

\]所以:

\[(x+1)^p\equiv (x^p+1)\pmod p

\]把這個結論帶進去:

\[(1+x)^n\equiv (1+x^p)^s(1+x)^q \pmod p

\]再由二項式定理把右邊展開

\[(1+x)^n\equiv \sum_^s \tbinomx^\cdot \sum_^q \tbinomx^j

\]同樣我們可以把左邊展開:

\[(1+x)^n=\sum_^\tbinomx^i

\]然後我們可以發現,左右兩遍都有\(x^\)次項(當然,這是在\(m\leq n\)的情形下,如果\(m>n\)結果就是0,不用考慮了)

比較一下它們的係數

左邊:\(\tbinomx^\)

右邊:\(\tbinomx^\cdot \tbinomx^w\)

這邊要說明一下,不會出現別的次數組合,比如\((t-1)p\)和\((w+p)\),因為\(w,q

所以:\(\tbinom\equiv \tbinom\tbinom\pmod p\)

即:\[\tbinom\equiv\tbinom\tbinom\rfloor} \rfloor}\pmod p

\]然後把\(\tbinom\rfloor} \rfloor}\)這一項不斷展開,其實就變為了那種非遞迴形式

好了,我們終於得到了這個定理

那寫**就簡單了,將\(n,m\)轉化為\(p\)進製

預處理出階乘陣列,和階乘的逆元陣列

然後對於這\(p\)進製的每一位直接套組合數公式就行了

然而**似乎沒有遞迴的好寫

那麼說一下踩得坑,首先主函式for迴圈裡的特判一定要有,避免出現陣列下標變成負數,或者使用0的逆元的情況

還有多測時前導0的位置一定要清零

#include#include#include#include#include#include#include#define reg register

#define en std::puts("")

#define ll long long

inline int read()

while(c>='0'&&c<='9')

return y?x:-x;

}int n,m,p;

ll fac[200006],g[200006];

int a[100006],b[100006];

inline ll power(ll x,ll y)

return ans;

}std::stacks;

inline void pre()

while(!s.empty()) a[++a[0]]=s.top(),s.pop();

int tmp=0;

while(m)

while(b[0]+tmpwhile(!s.empty()) b[++b[0]]=s.top(),s.pop();

fac[0]=1;

for(reg int i=1;ig[p-1]=power(fac[p-1],p-2);

for(reg int i=p-2;i;i--) g[i]=(1ll*g[i+1]*(i+1))%p;

}int main()

if(a[i]==b[i]) continue;

ans=(1ll*ans*fac[a[i]])%p;

ans=(1ll*ans*g[b[i]])%p;

ans=(1ll*ans*g[a[i]-b[i]])%p;

} std::printf("%lld\n",ans);

} return 0;

}

P3807 模板 盧卡斯定理

題目背景 這是一道模板題。題目描述 給定n,m,p 1 le n,m,p le 10 51 n,m,p 105 求 c mod pc n mm mod p 保證p為prime c表示組合數。乙個測試點內包含多組資料。輸入格式 第一行乙個整數t t le 10t 10 表示資料組數 第二行開始共t行,...

洛谷 P3807 模板 盧卡斯定理

洛谷智推模板題,qwq,還是太弱啦,組合數基礎模板題還沒做過。給定n,m,p 1 le n,m,p le 10 5 求 c mod p lucas 定理 c c times c mod p 相當於把 n,m 寫成 p 進製數 a 1,a 2 dotso a k b 1,b 2 dotso b k c...

洛谷P3807 模板 盧卡斯定理

這是一道模板題。給定n,m,p 1 le n,m,p le 10 51 n,m,p 10 5 求 c mod pc n m m modp 保證p為prime c表示組合數。乙個測試點內包含多組資料。輸入格式 第一行乙個整數t t le 10t 10 表示資料組數 第二行開始共t行,每行三個數n m ...