zoukankan      html  css  js  c++  java
  • 类欧几里得算法

    类欧几里得算法

    参考博客

    我们要求下面的函数:

    [F(a,b,c,n)=sum_{i=0}^nlfloorfrac{a*i+b}{c} floor ]

    我们的方法是分两类情况递归下去求解。

    边界条件:(a=0)是,(F=(n+1)lfloor frac{b}{c} floor)

    1.(ageq c)(bgeq c)

    设:

    [a=x*c+y ]

    则:

    [lfloorfrac{a}{c} floor=lfloorfrac{y}{c} floor+frac{x*c}{c} ]

    通过这个公式我们可以得到如下的变换:

    [egin{align} lfloorfrac{a*i+b}{c} floor&=lfloorfrac{(c*lfloorfrac{a}{c} floor +amod c)*i+(c*lfloorfrac{b}{c} floor + bmod c)}{c} floor\ &=lfloorfrac{amod c*i+bmod c}{c} floor + i*lfloorfrac{a}{c} floor +lfloorfrac{b}{c} floor \ end{align} ]

    所以我们得到:

    [F(a,b,c,n)=F(amod c,bmod c,c,n)+frac{n(n+1)}{2}lfloorfrac{a}{c} floor+(n+1)lfloorfrac{b}{c} floor ]

    2.(a<c)(b<c)

    首先我们要知道:(lfloor a floor)实际上就是(leq a)的正整数。

    然后直接大力推式子:

    (m=lfloorfrac{a*n+b}{c} floor)

    [egin{align} F&=sum_{i=0}^nsum_{j=1}^m[lfloorfrac{a*i+b}{c} floor geq j]\ &=sum_{i=0}^nsum_{j=0}^{m-1} [lfloorfrac{a*i+b}{c} floor geq j+1]\ &=sum_{i=0}^nsum_{j=0}^{m-1}[frac{a*i+b}{c}geq j+1]\ &=sum_{j=0}^{m-1}sum_{i=0}^{n}[igeq frac{j*c+c-b}{a}]\ end{align} ]

    因为:

    [xgeq lfloor frac{a}{c} floor\ Rightarrow x>lfloorfrac{a-1}{c} floor ]

    所以:

    [egin{align} F &=sum_{j=0}^{m-1}sum_{i=0}^{n}[igeq frac{j*c+c-b}{a}]\ &=sum_{j=0}^{m-1}sum_{i=0}^{n}[i> frac{j*c+c-b-1}{a}]\ &=sum_{j=0}^{m-1}n-lfloorfrac{j*c+c-b-1}{a} floor\ &=n*m-sum_{j=0}^{m-1}lfloorfrac{j*c+c-b-1}{a} floor end{align} ]

    于是我们又得到了:

    [F(a,b,c,n)=n*m-F(c,c-b-1,a,m-1)\ ]

    其他几种就不会了。

  • 相关阅读:
    监控代码运行时长 -- StopWatch用法例程
    验证码处理算法(一)
    Linux下安装JDK及相关配置
    JAVA爬虫---验证码识别技术(一)
    JAVA4大线程池
    海量数据去重(上亿数据去重)
    python协程与异步协程
    解决WinSCP连接虚拟机
    生产消费者模式与python+redis实例运用(中级篇)
    生产消费者模式与python+redis实例运用(基础篇)
  • 原文地址:https://www.cnblogs.com/hchhch233/p/10746740.html
Copyright © 2011-2022 走看看