題解大部分都是遞迴實現的,給出一種非遞迴的形式
話說上課老師講的時候沒給**,然後自己些就寫成了這樣
對於質數\(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 ...