• 【算法笔记】类欧几里得相关


    ·前置芝士

    ·欧几里得算法

    又称辗转相除法,举例如gcd求法,基本递归函数为(f(a,b)=f(b,amod b))

    证明:a可以表示成(a = kb + r)(a,b,k,r皆为正整数,且(r<b)),则(r = a mod b)。假设d是a,b的一个公约数,记作(d|a),(d|b),即a和b都可以被d整除。而r = (a - kb),两边同时除以d,(r/d=a/d-kb/d=m),由等式右边可知m为整数,因此(d|r)因此d也是(b,a mod b)的公约数。因((a,b))((b,amod b))的公约数相等,则其最大公约数也相等。

    ·正文

    ·定义:定义函数(f(a,b,c,n)=sum_{i=0}^{n} lfloor frac{ai+b}{c} floor),其中a,b,c,d都是常数,我们要求算法复杂度为(O(n log n))

    ·求解方式:我们可以对该式子做一些处理:

    ​ ·对于(ageq c)(b geq c),我们可以直接将(a)(b)(c)取模以简化问题。将式子改变一下可得:

    (f(a,b,c,n))

    (=sum_{i=0}^{n} lfloor frac{ai+b}{c} floor)

    (=sum_{i=0}^{n} frac{(lfloor frac{a}{c} floor c+amod c)i+(lfloor frac{b}{c} floor c+bmod c)}{c})

    (=frac{n(n+1)}{2}lfloorfrac{a}{c} floor+(n+1)lfloorfrac{b}{c} floor+ sum_{i=0}^{n}lfloor frac{(amod c)i+(bmod c)}{c})

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

    那么问题转化为了(a<c)(b<c)的情况。接下来我们从该i下手,我们尝试合并贡献来计算。但是这个式子的贡献似乎不好合并。那么我们转化一下,将和的式子变成另一个格式:(sum_{i=0}^{n} sum_{j=0}^{lfloor frac{ai+b}{c} floor-1}1)

    然后我们来试试看搞一个和(j)有关的贡献式。我们可以用上面和式中的(n)限制(i)的上界,然后用(i)来限制(j)的上界。然后我们交换一下(i)(j)的求和算子。得到:(sum_{j=0}^{lfloor frac{an+b}{c} floor-1}sum_{i=0}^{n}[j<lfloorfrac{ai+b}{c} floor])

    然后我们来把下取整符号拿下,可得:(j+1leqfrac{ai+b}{c})

    然后变换一下又有:(jc+c-b-1<ai)

    然后我们向下取整:(lfloorfrac{jc+c-b-1}{a} floor<i)

    我们定义(m=lfloorfrac{an+b}{c} floor),则有

    (f(a,b,c,n))

    (=sum_{j=0}^{m-1}sum_{i=0}^{n}[i>lfloorfrac{jc+c-b-1}{a} floor])

    (=sum_{j=0}^{m-1}n-lfloorfrac{jc+c-b-1}{a} floor)

    (=nm-f(c,c-b-1,a,m-1))

    ·代码:

    long long f(long long a,long long b,long long c,long long n){
    	if(a==0)return((b/c)*(n+1));
    	if(a>=c||b>=c)return f(a%c,b%c,c,n)+(a/c)*n*(n+1)/2+(b/c)*(n+1);
    	long long m=(a*n+b)/c;
    	return n*m-f(c,c-b-1,a,m-1);
    }
    

    ·扩展:

    给出另外两个定义:

    定义(g(a,b,c,n)=sum_{i=0}^{n}ilfloorfrac{ai+b}{c} floor)(h(a,b,c,n)=sum_{i=0}^{n}lfloorfrac{ai+b}{c} floor^2)

    ·关于g的解法:

    首先取模,有:(g(a,b,c,n)=g(amod c,bmod c,c,n)+lfloorfrac{a}{c} floor frac{n(n+1)(2n+1)}{6}+lfloorfrac{b}{c} floorfrac{n(n+1)}{2})

    然后考虑(a<c)(b<c),依旧令(m=lfloorfrac{an+b}{c} floor),有:

    (g(a,b,c,n)=frac{1}{2}[mn(n+1)-h(c,c-b-1,a,m-1)-f(c,c-b-1,a,m-1)])

    ·关于h的解法:

    首先取模,有(h(a,b,c,n)=h(amod c,bmod c,c,n)+2lfloorfrac{b}{c} floor f(amod c,bmod c,c,n)+)

    (2lfloorfrac{a}{c} floor g(amod c,bmod c,c,n)+lfloorfrac{a}{c}^2frac{n(n+1)(2n+1)}{6}+lfloorfrac{b}{c} floor^2(n+1)+lfloorfrac{a}{c} floor lfloorfrac{b}{c} floor n(n+1))

    然后考虑(a<c)(b<c),令(m=lfloorfrac{an+b}{c} floor),有:

    (h(a,b,c,n)=nm(m+1)-2g(c,c-b-1,a,m-1)-2f(c,c-b-1,a,m-1)-f(a,b,c,n))

    对于以上几种定义可以同步进行计算。

    (PS:关于这一部分的具体推导过程请看参考资料部分)

    ·参考资料:

    https://oi-wiki.org/math/euclidean/

  • 相关阅读:
    设置跨域
    Vs自定nuget push菜单
    VS IIS Express 支持局域网访问
    字符串GZIP压缩解压
    C# 使用 protobuf 进行对象序列化与反序列化
    RabbitMQ
    如果调用.net core Web API不能发送PUT/DELETE请求怎么办?
    log4net配置使用
    redis实现消息队列
    Error-the resource is not on the build path of a java project
  • 原文地址:https://www.cnblogs.com/linskyQWQ/p/14597989.html
Copyright © 2020-2023  润新知