卢卡斯定理

来源:互联网 发布:淘宝御泥坊官网 编辑:程序博客网 时间:2024/06/06 02:16
Lucas定理:我们令n=sp+q , m=tp+r .(q ,r ≤p),p为素数
那么:

int Lucas (ll n , ll m , int p) {        return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p , m/p , p) %  p ;}//comb()函数中,因为q , r < p , 所以这部分暴力完成即可。 //  C++// 求C(n, m) mod 10007    版本二 要求p z在100000左右LL f[N];  //N为组合数的底数 的范围void init(int p){f[0] = 1;for(int i = 1; i <= p; ++i)f[i]  = f[i-1] * i % p;}LL pow_mod(LL a, LL x, int p){LL ret = 1;a %= p;while(x){if(x & 1){ret = ret * a % p;--x;}else{a = a * a % p;   x >>= 1;}}return ret;}LL Lucas(LL n, LL k, int p){LL ret = 1;while(n && k){LL nn = n % p, kk = k % p;if(nn < kk) return 0;ret = ret * f[nn] * pow_mod(f[kk] * f[nn - kk] % p, p - 2, p) % p;n /= p;k /= p;}return ret;}
</pre><pre code_snippet_id="1660586" snippet_file_name="blog_20160425_1_5341677" name="code" class="cpp">相关题目:
1. hdu3037  saving beans;
                                             
0 0
原创粉丝点击