Lucas定理

来源:互联网 发布:360度全景图制作 js 编辑:程序博客网 时间:2024/05/17 02:03

Lucas定理是用来求C(n,m)%p的值,其中n与m均为非负整数,p是素数。

先说说这个值应该怎么算。

设Lucas(n, m, p)为上式的值,则Lucas(n, m, p) = cn(n % p, m % p) * Lucas(n / p, m / p, p), Lucas(x, 0, p) = 1;

其中cm(n, m) = a! * (b! * (a - b)!) ^ (p - 2) % p = (a! / (a - b)!) * (b!) ^ (p - 2) % p

代码如下:

int cm(int n, int m){if(n < m)return 0;else if(m > n - m)m = n - m;int s1 = 1, s2 = 1;for(int i = 0; i < m; i++)s1 = s1 * (n - i) % p, s2 = s2 * (i + 1) % p;return s1 * qpow(s2, p - 2) % p; //qpow是快速幂}int lucas(int n, int m){if(m == 0)return 1;return cm(n % p, m % p) * lucas(n / p, m / p) % p;}




原创粉丝点击