码迷,mamicode.com
首页 > 其他好文 > 详细

Lucas定理 以及 C

时间:2015-09-16 17:36:59      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

最近碰到一题,问你求技术分享mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 。

要解决这个问题首先需要Lucas定理 或者 C!解法。

Lucas定理

我们令n=sp+q , m=tp+rq , r ≤ p

那么技术分享,然后你只要继续对技术分享调用Lucas定理即可。

代码可以递归的去完成这个过程,其中递归终点为t = 0

伪代码,时间O(logp(n)*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 , 所以这部分暴力完成即可。

 Lucas定理证明:

证明资料:http://www.cut-the-knot.org/arithmetic/algebra/LucasTheorem.shtml

首先你需要这个算式:技术分享,然后

(1 + x) n Ξ (1 + x) sp+q  Ξ ( (1 + x)p)s • (1 + x) q Ξ (1 + xp) s • (1 + x)   (mod p) ;

技术分享.

所以技术分享,通过左右系数比较,你就会发现技术分享,及i=t , j=r的时候。

 

Lucas定理 以及 C

标签:

原文地址:http://www.cnblogs.com/get-an-AC-everyday/p/4813692.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!