前几天gryz组织我们听了几天数论,蒟蒻 Nanjo_Qi 自然是听得一点问题也没有。
于是只能自己yy着学一点其他的数学的东西,正巧在那之前刚刚学会卢卡斯定理,于是现在就来水一篇博客。
其实是不想做题了。正巧机房装修,吵的一批。
卢卡斯(Lucas)定理是什么?
他是用来求组合数 C(n, m) % p 值的定理,这里的p是素数。所以,它是一个解决大组合数求模的算法。所以看起来还是很有用的感觉。
为了给以后的学习做铺垫,我们先来了解一下乘法逆元:
逆元是指一个可以取消另一给定元素运算的元素,例如加法中的加法逆元和乘法中的倒数。
而一个数关于模p意义下的逆元可以利用快速幂,扩展欧几里得算法等求得:
已知(a, p) = 1,则 ap-1 ≡ 1 (mod p), 所以 a * ap-2 ≡ 1 (mod p) ,也就是 (m!(n-m)!) 的逆元为 (m!(n-m)!)p-2 。
1 typedef u64 long long; 2 3 inline u64 Fast_Pow(u64 k, u64 b) { 4 u64 ans = 1; 5 while(b) { 6 if( b&1 ) ans = ans * k % p; 7 k = k * k % p, b >>= 1; 8 } 9 return ans; 10 }