首页 > 编程语言 >【学习笔记】类欧几里得算法

【学习笔记】类欧几里得算法

时间:2023-08-06 20:55:11浏览次数:39  
标签:lfloor right dfrac 欧几里得 笔记 算法 rfloor mod left

概述

主要是求以下三个式子:

\[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor \]

\[g(a,b,c,n)=\sum_{i=0}^n i\left\lfloor\dfrac{ai+b}{c}\right\rfloor \]

\[h(a,b,c,n)=\sum_{i=0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor^2 \]

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

首先规范成 \(a<c,b<c\) 的情况,可以推得:

\[\begin{aligned} f(a,b,c,n)&=\sum_{i=0}^n \left\lfloor\dfrac{(\left\lfloor\frac{a}{c}\right\rfloor c+a\bmod c)i+(\left\lfloor\frac{b}{c}\right\rfloor c+b\bmod c)}{c}\right\rfloor\\ &=\left\lfloor\dfrac{a}{c}\right\rfloor\dfrac{n(n+1)}{2}+\left\lfloor\dfrac{b}{c}\right\rfloor(n+1)+\sum_{i=0}^n \left\lfloor\dfrac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor\\ &=\left\lfloor\dfrac{a}{c}\right\rfloor\dfrac{n(n+1)}{2}+\left\lfloor\dfrac{b}{c}\right\rfloor(n+1)+f(a\bmod c,b\bmod c,c,n) \end{aligned} \]

之后再推导:

\[\begin{aligned} f(a,b,c,n)&=\sum_{i=0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor\\ &=\sum_{i=0}^n\sum_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor-1} 1\\ &=\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\sum_{i=0}^n \left[j<\left\lfloor\dfrac{ai+b}{c}\right\rfloor\right]\\ \end{aligned} \]

可以经过一系列变换:

\[j<\left\lfloor\dfrac{ai+b}{c}\right\rfloor\Leftrightarrow j+1\le \left\lfloor\dfrac{ai+b}{c}\right\rfloor\Leftrightarrow j+1\le \dfrac{ai+b}{c} \]

整理可以得到:

\[jc+c-b\le ai\Leftrightarrow jc+c-b-1<ai\Leftrightarrow \left\lfloor\dfrac{jc+c-b-1}{a}\right\rfloor<i \]

设 \(m=\left\lfloor\dfrac{an+b}{c}\right\rfloor\),可以得到:

\[\begin{aligned} f(a,b,c,n)&=\sum_{j=0}^{m-1} \sum_{i=0}^n \left[i>\left\lfloor\dfrac{jc+c-b-1}{a}\right\rfloor\right]\\ &=\sum_{j=0}^{m-1} \left(n-\left\lfloor\dfrac{jc+c-b-1}{a}\right\rfloor\right)\\ &=mn-f(c,c-b-1,a,m-1) \end{aligned} \]

注意到递归过程 \(a,c\) 交换,类似欧几里得算法(因此叫类欧几里得算法),复杂度是 \(O(\log n)\)。

上面的推导过程重点在:

  • 设立第二维并交换求和号。

  • 把艾弗森括号内的式子放缩并变形,方便化简。

求 \(g(a,b,c,n)\)

设 \(m=\left\lfloor\dfrac{an+b}{c}\right\rfloor\),\(k=\left\lfloor\dfrac{jc+c-b-1}{a}\right\rfloor\),类比过程。

先是取模:

\[g(a,b,c,n)=\left\lfloor\dfrac{a}{c}\right\rfloor\dfrac{n(n+1)(2n+1)}{6}+\left\lfloor\dfrac{b}{c}\right\rfloor \dfrac{n(n+1)}{2}+g(a\bmod c,b\bmod b,c,n) \]

之后是:

\[\begin{aligned} g(a,b,c,n)&=\sum_{i=0}^n i\left\lfloor\dfrac{ai+b}{c}\right\rfloor\\ &=\sum_{i=0}^n i\sum_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor-1} 1\\ &=\sum_{j=0}^{m-1} \sum_{i=0}^n i[i>k]\\ &=\sum_{j=0}^{m-1} \dfrac{(k+1+n)(n-k)}{2}\\ &=\dfrac{1}{2}\sum_{j=0}^{m-1} n(n+1)-k-k^2\\ &=\dfrac{1}{2}(mn(n+1)-f(c,c-b-1,a,m-1)-h(c,c-b-1,a,m-1)) \end{aligned} \]

求 \(h(a,b,c,n)\)

直接上过程了:

\[\begin{aligned} h(a,b,c,n)&=\left\lfloor\dfrac{a}{c}\right\rfloor^2 \dfrac{n(n+1)(2n+1)}{6}+\left\lfloor\dfrac{b}{c}\right\rfloor^2 (n+1)+h(a\bmod c,b\bmod c,c,n)\\&+2\left\lfloor\dfrac{a}{c}\right\rfloor g(a\bmod c,b\bmod c,c,n)+2\left\lfloor\dfrac{b}{c}\right\rfloor f(a\bmod c,b\bmod c,c,n)+\left\lfloor\dfrac{a}{c}\right\rfloor\left\lfloor\dfrac{b}{c}\right\rfloor(n+1)\end{aligned} \]

之后略微有变化,由于式子中带着平方,为了避免出现 \(\sum\times \sum\) 之类的情况,使用 \(n^2=2\sum_{i=0}^n i-n\) 来改写。

于是:

\[\begin{aligned} h(a,b,c,n)&=\sum_{i=0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor^2\\ &=\sum_{i=0}^n \left(2\sum_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor} j-\left\lfloor\dfrac{ai+b}{c}\right\rfloor\right)\\ &=2\sum_{i=0}^n \sum_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor-1}(j+1)-f(a,b,c,n)\\ &=2\sum_{j=0}^{m-1} (j+1)\sum_{i=0}^n [i>k]-f(a,b,c,n)\\ &=2\sum_{j=0}^{m-1} (j+1)(n-k)-f(a,b,c,n)\\ &=2\sum_{j=0}^{m-1} n(j+1)-k-jk-f(a,b,c,n)\\ &=2\left(\dfrac{m(m+1)n}{2}-f(c,c-b-1,a,m-1)-g(c,c-b-1,a,m-1)\right)-f(a,b,c,n)\\ &=m(m+1)n-2f(c,c-b-1,a,m-1)-2g(c,c-b-1,a,m-1)-f(a,b,c,n) \end{aligned} \]

注意到 \((a,b,c,n)\) 的答案只和 \((c,c-b-1,a,m-1)\) 有关,所以只递归一次即可。

点击查看代码
struct Data{
    ll f,g,h;
    Data()=default;
    Data(ll f_,ll g_,ll h_):f(f_),g(g_),h(h_){}
};

Data solve(int a,int b,int c,int n){
    Data now=Data(0,0,0),res=Data(0,0,0),last=Data(0,0,0);
    ll S0=(n+1)%mod,S1=1ll*n*(n+1)%mod*inv2%mod,S2=1ll*n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
    int d1=a/c,d2=b/c;
    a%=c,b%=c;
    int m=(1ll*a*n+b)/c;
    if(a) last=solve(c,c-b-1,a,m-1);
    now.f=(1ll*n*m%mod-last.f+mod)%mod;
    res.f=(S1*d1%mod+S0*d2%mod+now.f)%mod;
    now.g=(1ll*m*n%mod*(n+1)%mod-last.f+mod-last.h+mod)%mod*inv2%mod;
    res.g=(S2*d1%mod+S1*d2%mod+now.g)%mod;
    now.h=(1ll*n*m%mod*(m+1)%mod-2*last.f%mod+mod-2*last.g%mod+mod-now.f+mod)%mod;
    res.h=(S2*d1%mod*d1%mod+S0*d2%mod*d2%mod+now.h+2ll*d1*now.g%mod+2ll*d2*now.f%mod+2*S1*d1%mod*d2%mod)%mod;
    return res;
}

参考资料

  • OI Wiki

标签:lfloor,right,dfrac,欧几里得,笔记,算法,rfloor,mod,left
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Euclidean-like_Algorithm.html

相关文章

  • GAMES101笔记(03)
    前几个月忙着拯救地球所以有比较长时间的空档这次笔记对应的是games101内容的第六课,至于为什么跳过第五课因为第五课我感觉也没啥需要记笔记的,基本就是光栅化的一些基本概念以及最基本的一些实现理念,视频最后讲到了关于锯齿和走样的一些东西,第六课开头即紧接着这部分进行讲解采......
  • Vue学习笔记:路由开发 Part 02
    在上一篇中,默认情况下浏览器控制台会提示 [VueRouterwarn]:Nomatchfoundforlocationwithpath"/"这是因为没有定义path为/的情况导致的。在实际使用中,可以将/通过路由进行绑定,也可以通过重定向,进行跳转。路由重定向为/,通过redirect进行重定向import{createRouter,crea......
  • 「学习笔记」二维数点
    P2163[SHOI2007]园丁的烦恼-洛谷|计算机科学教育新生态(luogu.com.cn)这个是二维数点的板子题,二维数点这一类题目就是上面的题所描述的,我们用树状数组+离散化来解决这个问题。这里就不解释了,记录此篇博文的目的主要就是提醒自己曾经学过这个,看看代码,方便回忆起来。这......
  • 算法 华为
     1、链表,两两交换位置,不允许修改值,只能改节点例如1234,=>21432、拔河比赛选拔队员,输入身高,体重。按这两个优先级排序例如输入1827019060输出1906019060 3、最小花费问题(这个分值200,比前面的难)输入产品数量n,需要输出k种方案n个产品对应的价格数组输出:前k小......
  • 【狂神说Java】Java零基础学习笔记-Java方法
    【狂神说Java】Java零基础学习笔记-Java方法Java方法01:何谓方法?System.out.println(),那么它是什么呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:方......
  • 博弈论笔记
    博弈论公平组合游戏公平组合游戏(ImpartialGame)的定义如下:\(\bullet\)游戏有两个人参与,二者轮流做出决策,双方均知道游戏的完整信息;\(\bullet\)任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;\(\bullet\)游戏中的同一个状态不可能多次......
  • 数据结构与算法(四):双向链表
    基本概念双向链表概念和单向链表是一致的,区别在于双向链表在单向链表的基础上,指针区域多了一个指向上一个节点的指针。单向链表内容可以参考我的上一篇文章:http://t.csdn.cn/Iu56H。基本的数据结构如图所示:链表结构双向链表结构包含了节点的数据内容和两个指针:指向前一个节点......
  • m基于FFT傅里叶变换的QPSK基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:2.算法涉及理论知识概要QPSK(QuadraturePhaseShiftKeying)是一种常用的调制方式,它可以在相位和......
  • m基于FFT傅里叶变换的QPSK基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:   将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:   2.算法涉及理论知识概要       QPSK(QuadraturePhaseShiftKeying)......
  • 基于位相光栅的四波横向剪切干涉法波前检测算法的matlab仿真
    1.算法理论概述      波前检测技术是现代光学中的重要技术之一,可以用于衡量光学系统的成像质量和研究光学系统的异常现象。随着现代光学技术的不断发展,波前检测技术也在不断地发展和完善。其中,基于位相光栅的四波横向剪切干涉法波前检测算法是一种常用的波前检测算法,本文......