首页 > 编程语言 >万能欧几里得算法

万能欧几里得算法

时间:2023-06-18 11:11:42浏览次数:39  
标签:Info frac log xlim 欧几里得 算法 return ll 万能

问题

有一条直线 \(y=\frac{Px+K}{Q}\),其中 \(P\ge 0\) 且 \(0\le K<Q\)。有两种操作 \(U,R\),从左到右扫描这条直线在 \((0,L]\) 中的部分,若直线跨越了 \(y=k(k\in \mathbb{Z})\) 这条直线,则执行 \(U\) 操作;若直线跨越了 \(x=k(k\in \mathbb{Z})\) 这条直线,则执行 \(R\) 操作。若同时跨越则先执行 \(U\) 再执行 \(R\)。

操作满足结合律,且合并两个操作的时间复杂度是 \(O(1)\)。

万能欧几里得算法

我们设 \(\operatorname{solve}(P,Q,K,L,U,R)\) 为上述问题的答案。类似于欧几里得算法,我们讨论 \(P\) 和 \(Q\) 的大小关系:

  • 若 \(P\ge Q\),那么每个 \(R\) 操作前一定有至少 \(\lfloor \frac{P}{Q}\rfloor\) 个 \(U\) 操作。可以把 \(R\) 操作和这些 \(U\) 操作合并起来,递归到 \(\operatorname{solve}(P\bmod Q,Q,K,L,U,RU^{\lfloor \frac{P}{Q}\rfloor})\)。

  • 若 \(P<Q\),那么需要尝试递归到 \(\operatorname{solve}(Q,P,\dots)\) 之类的东西。原先的问题是,第 \(x\) 个 \(R\) 前面有 \(\lfloor \frac{Px+K}{Q}\rfloor\) 个 \(U\),那么可以算出第 \(y\) 个 \(U\) 前有 \(\lfloor \frac{Qy-K-1}{P}\rfloor\) 个 \(R\)。

    但直接递归下去不满足 \(0\le K<Q\)。考虑把第一个 \(U\) 及以前的部分截去,这样 \(K\) 就会变成 \(Q-K-1\)。而第一个 \(U\) 前有 \(\lfloor \frac{Q-K-1}{P}\rfloor\) 个 \(R\),于是递归到 \(R^{\lfloor \frac{Q-K-1}{P}\rfloor}U\operatorname{solve}(Q,P,Q-K-1,C,R,U)\),其中 \(C=\lfloor\frac{PL+K}{Q}\rfloor\) 是 \(U\) 的个数。

    在最后一个 \(U\) 后面仍有一些 \(R\),可以算出这样的 \(R\) 的个数是 \(L-\lfloor \frac{QC-K-1}{P}\rfloor\),再乘上一些 \(R\) 即可。

尽管这个过程中需要做快速幂,但由于快速幂的指数可以估算为 \(\frac{Q}{P}\),而 \(\log(\frac{Q}{P})=\log Q-\log P\),递归到下一层后 \(P,Q\) 交换,所以这个 \(\log\) 可以被抵消掉。于是时间复杂度为 \(O(\log \max(P,Q))\)。

代码

ll Div(ll a, ll b, ll c, ll d) {
	return (__int128(a) * b + c) / d;
}
template<typename Info>
Info _Euclid(ll p, ll q, ll k, ll xlim, const Info& u, const Info& r) {
	if (!xlim) return Info();
	if (p >= q) return _Euclid(p % q, q, k, xlim, u, u * (p / q) + r);
	ll m = Div(xlim, p, k, q);
	if (!m) return r * xlim;
	ll cnt = xlim - Div(q, m, -k - 1, p);
	return r * ((q - k - 1) / p) + u + _Euclid(q, p, (q - k - 1) % p, m - 1, r, u) + r * cnt;
}
template<typename Info>
Info Euclid(ll p, ll q, ll k, ll xlim, const Info& u, const Info& r) {
	assert(0 <= p && 0 < q && 0 <= k && 0 <= xlim);
	return u * (k / q) + _Euclid(p, q, k % q, xlim, u, r);
}

标签:Info,frac,log,xlim,欧几里得,算法,return,ll,万能
From: https://www.cnblogs.com/alan-zhao-2007/p/euclid-algorithm.html

相关文章

  • 归并排序算法及C语言实现
    一、归并排序的原理归并排序(MergeSort)是一种基于分治思想的高效排序算法。其核心思想是将待排序的数组分为两个相等的部分,对这两个部分分别进行递归排序,最后将两个有序的子数组合并成一个有序的整体。可见归并排序的时间复杂度为O(nlog2n)。下面我们来详细地介绍一下归并排序的过......
  • 算法与数据结构Day01
    希尔排序的实现#include<stdio.h>#include<stdlib.h>typedefintKeyType;typedefstruct{KeyType*elem;/*elem[0]一般作哨兵或缓冲区*/intLength;}SqList;voidCreatSqList(SqList*L);/*待排序列建立,......
  • 算法与数据结构Day02
    修建道路#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;intinf=0x3f3f3f;intmap[105][105],dis[105],book[105];intm,n;intprim(){inti,j,k,sum=0,u,min;for(i=1;i<=n;i++){......
  • 深度学习-算法的创世纪【人工智能】
    深度学习通过训练深层神经网络模型,可以自动学习和提取数据的特征,包括更准确的图像识别、自然语言处理、医学诊断等方面的应用。序言深度学习是一种机器学习方法,其目标是通过模拟人脑神经网络的结构和功能,让机器能够从大量的数据中自动学习和提取特征,从而实现智能化的数据处理和决......
  • 算法与数据结构——kmp算法
    7-1jmu-ds-实现KMP分数 10#include<stdio.h>#include<iostream>#include<string.h>usingnamespacestd;constintMAX_LEN=20010;//本题运用到字符串比对中的next[j]求法具体算法可以直接百度//get_next就是用于求next[j]的这里只需要传入目标串就行voidget_nex......
  • 代码随想录Day24|回溯算法+JAVA大作战
     今日任务39. 组合总和40.组合总和II131.分割回文串 93.复原IP地址  78.子集   90.子集II   39.组合总和classSolution{List<List<Integer>>ans=newArrayList<>();LinkedList<Integer>now_ans=newLinkedList<>();publicLi......
  • [ML从入门到入门] 初识人工神经网络、感知机算法以及反向传播算法
    前言人工神经网络(Artificialneuralnetworks,ANNs)被广泛认为诞生于20世纪四五十年代,其核心理论可以追溯到19世纪初 Adrien-MarieLegendre发明的最小二乘法,而在今天,经过了半个世纪互联网和计算机技术的迅猛发展,这片耕耘良久的沃土重新掀起了机器学习的研究热潮。本文主要......
  • Day03 3.3 使用Python还原算法
    Day033.3使用Python还原算法加密分类1、单向加密:MD5、sha系列不可逆2、对称加密:AES、DES3、非对称加密:RSA、DSA4、补充算法:base64【一】md5importhashlibm=hashlib.md5()m.update('helloworld'.encode("utf8"))print(m.hexdigest())【二......
  • Java彩虹渐变算法
    彩虹渐变算法前言​ 最近有一个需求是需要一直去改变字体的颜色,然后我就想到了使用彩虹颜色作为字体颜色,使颜色按照彩虹颜色的顺序进行变化。​ 然后查了一下彩虹的颜色可以分为6种(对,不是七种),用RGB来表示分别是#FF00FF,#FFFF00,#00FF00,#00FFFF,#0000FF,#FF00FF,因此我们只需要......
  • 算法复习
    选择题考点:时间复杂性从低到高的顺序是?问题:有一个算法,它的时间复杂性T(n)的递归定义如下,问T(n)是?下面哪些内容不是算法设计之前要完成的内容?使用何种计算机语言设计程序在算法设计与分析过程中,有算法设计,算法的正确性证明,算法的复杂性分析,程序设计等几个重要步骤,下......