大數組合 盧卡斯定理

2021-08-19 03:03:56 字數 1026 閱讀 5694

組合數我們用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...