[Lucas定理]【学习笔记】

这种神奇的东西...............


参考资料:http://www.cnblogs.com/jianglangcaijin/p/3446839.html


Lucas定理

适用于n很大p较小的时候

$ C_n^m\%p \ p \ is \ prime$

$ n=n_k*p^k+n_{k-1}*p^{k-1}+...+n_2*p^2+n_1*p+n_0 $

$ m=m_k*p^k+m_{k-1}*p^{k-1}+...+m_2*p^2+m_1*p+m_0 $

$ C_n^m=\prod\limits_{i=0}^k C_{n_i}^{m_i} $

证明见参考资料(我不会告诉你我没看的)

实现:这个形式很像多项式啊变量为p,n和m迭代/=p然后算C(n%p,m%p)就行了

ll Pow(ll a,ll b){
    ll ans=1;
    for(;b;b>>=1,a=a*a%P)
        if(b&1) ans=ans*a%P;
    return ans;
}
ll Inv(ll a){return Pow(a,P-2);}
ll C(ll n,ll m){
    if(n<m) return 0;
    ll x=1,y=1;
    for(ll i=n-m+1;i<=n;i++) x=x*i%P;
    for(ll i=1;i<=m;i++) y=y*i%P;
    return x*Inv(y)%P;
}
ll Lucas(ll n,ll m){
    if(n<m) return 0;
    ll re=1;
    for(;m;n/=P,m/=P) re=re*C(n%P,m%P)%P;
    return re;
}

$ P \ is \ not \ prime $

看参考资料吧

$P$进行质因子分解,然后对于每个质因子$p_i^{e_i}$都得到一个同余方程

$x\equiv a_i\pmod {p_i^{e_i}}\\ $

用中国剩余定理合并就行了

但是$ C_n^m\%p_i^{e_i} $怎么求?

只要计算阶乘就行了,我们分成三部分:

比如:

$ n!=1∗2∗3∗4∗5∗6∗7∗8∗9∗10∗11∗12∗13∗14∗15∗16∗17∗18∗19 $
$ =(1∗2∗4∗5∗7∗8∗10∗11∗13∗14∗16∗17∗19)∗3^6∗(1∗2∗3∗4∗5∗6) $

假设当前质因子为$p$,$p_i^{e_i}=pr$

第一部分 $p$的倍数,有$\frac{n}{p}$个,提出$p$后形成了新的阶乘,递归解决

第二部分 提出的$p$ 只要最后计算$n!$中$p$出现次数然后 上-下 就行了

第三部分 不是$p$的倍数的部分;可以按$pr$分块,一共$\frac{n}{pr}$块,结果都是相同的;最后一块暴力计算即可

ll Pow(ll a,ll b,ll P){
    ll ans=1;
    for(;b;b>>=1,a=a*a%P)
        if(b&1) ans=ans*a%P;
    return ans;
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
    if(b==0) d=a,x=1,y=0;
    else exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}
ll Inv(ll a,ll n){
    ll d,x,y;
    exgcd(a,n,d,x,y);
    return d==1?(x+n)%n:-1;
}
ll Fac(ll n,ll p,ll pr){
    if(n==0) return 1;
    ll re=1;
    for(ll i=2;i<=pr;i++) if(i%p) re=re*i%pr;
    re=Pow(re,n/pr,pr);
    ll r=n%pr;
    for(int i=2;i<=r;i++) if(i%p) re=re*i%pr;
    return re*Fac(n/p,p,pr)%pr;
}
ll C(ll n,ll m,ll p,ll pr){
    if(n<m) return 0;
    ll x=Fac(n,p,pr),y=Fac(m,p,pr),z=Fac(n-m,p,pr);
    ll c=0;
    for(ll i=n;i;i/=p) c+=i/p;
    for(ll i=m;i;i/=p) c-=i/p;
    for(ll i=n-m;i;i/=p) c-=i/p;
    ll a=x*Inv(y,pr)%pr*Inv(z,pr)%pr*Pow(p,c,pr)%pr;
    return a*(MOD/pr)%MOD*Inv(MOD/pr,pr)%MOD;
}
ll Lucas(ll n,ll m){
    ll x=MOD,re=0;
    for(ll i=2;i<=MOD;i++) if(x%i==0){
        ll pr=1;
        while(x%i==0) x/=i,pr*=i;
        re=(re+C(n,m,i,pr))%MOD;
    }
    return re;
}
时间: 2024-10-20 17:28:52

[Lucas定理]【学习笔记】的相关文章

《机器学习导论》第三章 贝叶斯决策定理 学习笔记

在机器学习领域,我们碰到的第一个问题就是:如何选择特征量. 可是看了一些资料,这点好像都是一笔带过,因为很多都是所谓的不可观测量,如何把不可观测量量化呢?这个或许能给机器学习带来新的契机,就像当年牛顿把力.质量.加速度等模糊的概念定义下来,经典物理出现了前所未有的发展,香农把信息量化,造就了信息革命. 以前觉得贝叶斯好像没有大家说的那么神奇,现在知道,是因为当年对它的理解就有问题,贝叶斯更重要的一点应该是能够在加入evidence的情况下,从先验概率进化到后验概率,这点简直就是机器学习的内涵啊

Lucas定理学习(进阶中)

(1)Lucas定理:p为素数,则有: (2)证明: n=(ak...a2,a1,a0)p = (ak...a2,a1)p*p + a0 =  [n/p]*p+a0,m=[m/p]*p+b0其次,我们知道,对任意质数p有(1+x)^p=1+(x^p)(mod p) .我们只要证明这个式子:C(n,m)=C([n/p],[m/p]) * C(a0,b0)(mod p),那么就可以用归纳法证明整个定理.对于模p而言,我们有下面的式子成立: 上式左右两边的x的某项x^m(m<=n)的系数对模p同余.其

lucas 定理学习

大致意思就是求组合数C(n , m) % p的值, p为一个偶数 可以将组合数的n 和 m都理解为 p 进制的表示 n  = ak*p^k + a(k-1)*p^(k-1) + ... + a1*p + a0 m = bk*p^k + b(k-1)*p^(k-1) + ... + b1*p + b0 然后C(n,m)%p = C(ak , bk) * C(a(k-1) , b(k-1)) * ... * C(a1 , b1) * C(a0 , b0) % p 当然这其中出现 ai < bi的情况

【生成树计数】Matrix-tree定理学习笔记

学完了矩阵和行列式基础知识,终于可以去学矩阵数定理~(≧▽≦)/~ -----------–线割分是我>w<---------------– Matrix-tree定理,又叫Kirchhoff矩阵定理,于1847年首次被基尔霍夫先生证明,后来被广泛应用于生成树的计数问题. 要用它,需要先知道几个重要概念: 无向图的度数矩阵和邻接矩阵. 假定有无向图G,图中共有n个点. G的度数矩阵称D[G],邻接矩阵称A[G].这两个矩阵的大小都是n*n的. 对于D[G],他满足: di,j={0,     

Lucas定理--大组合数取模 学习笔记

维基百科:https://en.wikipedia.org/wiki/Lucas%27_theorem?setlang=zh 参考:http://blog.csdn.net/pi9nc/article/details/9615359 http://hi.baidu.com/lq731371663/item/d7261b0b26e974faa010340f http://hi.baidu.com/j_mat/item/8e3a891c258c4fe9dceecaba 综合以上参考,我做的一下总结:

poj1265&amp;&amp;2954 [皮克定理 格点多边形]【学习笔记】

Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊...  Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 Given a simple polygon constructed on a grid of equal-distanced points (i.e., points with integer coordinates) such that all the polygon's vertices a

【学习总结】数学-lucas定理

定义: 数论Lucas定理是用来求 C(mn)%p的值, p是素数. 描述: lucas(n,m,p)=lucas(n/p,m/p,p)?C(m%pn%p) lucas(n,0,p)=1 证明: 设p为素数,A,B为正整数,并且有(即A,B的p进制情况): A=akpk+ak?1pk?1+-+a1p1+a0 B=bkpk+bk?1pk?1+-+b1p1+b0 因为C(jp)=C(j?1p?1)?pj=0 (含有因子p) 所以(1+x)t(modp)=(1+xt)(modp) (中间展开项均含有C

【日常学习】【组合数取模Lucas定理】HDU3037 Saving Beans题解

[提前声明:此题没有通过!WA!有待进一步研究修改.放在这里只是起一个例子的作用,其实这道题鄙人并没有真正掌握= =]. [本文努力抄袭模仿了小花妹妹的博文0戳我0)] 题目大意:共T个测试点,每个测试点中,给定n.m,求将不超过m个种子放入n个坑的方案总数,最后答案对质数p取模.(一共m个,每个坑放多少无所谓,最后没放完m个也无所谓) 数据范围:1 <= n, m <= 1000000000, 1 < p < 100000. 思路:原题意即求方程x1+-+xn=m解的个数,因为中

学习:Lucas定理

模板题 Lucas定理 在数论中,Lucas定理用于计算二项式系数\({\tbinom {m}{n}}\)被质数\(p\)除的所得的余数. 描述 设\(p\)为素数,\(a,b\in N_+\),且 \[a=a_kp^k+a_{k-1}p^{k-1}+\cdots+a_1p+a_0\] \[b=b_kp^k+b_{k-1}p^{k-1}+\cdots+b_1p+b_0\] 这里\(0\leq a_i,b_i\leq p-1\bigwedge a_i,b_i\in Z(i=0,1,2,3,\cdo