組合數我們用cxx來表示,一切盡在**中。。。
簡單說就是一行**來回搗鼓:
lucas(n, m)%p = lucas(n/p, m/p)*c(n%p, m%p)%p
/*
這個是幹啥用的呢,有這麼一類題,讓你求個c54,呵呵簡單。
but,我資料範圍給你1~1e18,你怎麼說!
woc,你tm在玩我,ok你給我這麼大資料,無論如何long long都放不開吧。
好,我給你個p,你把結果mod它,行不?
你p給多大?
我給1~1e5,而且p是素數。
好,看我來a掉它!
盧卡斯部分:lucas(n, m)%p = lucas(n/p, m/p) * c(n%p, m%p) %p
↑這裡是不斷優化的盧卡斯 ↑這裡是優化後的cxx ↑%p也很重要
首先要明確,盧卡斯定理只不過是這類題型中的一部分,剩下的就是真正去求cxx,
所以這裡求cxx這一步就可以繼續優化了,比如我們已知p為素數,由費馬小定理:a^(p-1)=1(mod p),我們同時除以a,就變成了:a^(p-2)=1/a(mod p)
因為這裡的cxx就是n!/(m!(n - m)!),所以我們把(m!(n - m)!)換成逆元,加上上面的費馬小定理,1/a就可以求出來了。
下面的q_pow函式就是來求逆元滴
*/#include #include #include using namespace std;
typedef long long ll;
const int n =1e5;
ll n, m, p, fac[n];
void init()
ll q_pow(ll a, ll b)
return ans;
}ll c(ll n, ll m)
ll lucas(ll n, ll m )
int main()
return 0;
}
盧卡斯定理
問題求解 c m pmod 的值 c m frac color color 當分母含有x個p因子,分子含有y個p因子。color m pmod不為0 color color 分子分母p因子個數相同,算出的答案就是答案。不同,答案就是0.我的 但是因為我還沒看懂的原因,先留坑.include usin...
數論 組合數 盧卡斯定理
使用遞推式cab ca 1b c a 1b 1 c a b c b c cab c a 1b ca 1b 1 求解階乘 1e9 7 t 1 05 t 10 5 t 1051 b a 2000 1 leq b leq a leq 2000 1 b a 2000 include using namesp...
組合數取模(盧卡斯定理)
組合數取模 盧卡斯定理 模板 const int n 1e5 5 const int mod 10007 ll fac n 用於求取階乘取模 ll n void init ll quick pow ll a,ll b return ans ll c ll n,ll m ll lucas ll n,l...