首页 > 其他分享 >万能欧几里得

万能欧几里得

时间:2023-06-18 23:22:07浏览次数:33  
标签:lfloor frac 变换 欧几里得 rfloor 线段 线性变换 万能

之前有个题是类欧求 floor sum,感觉素质不是很高。

后来又有个题是万欧,这下这下了。


考虑这样一个事情:我们有一个 向量 \(v\),考虑有一条线段 \(y=\frac{ax+b}{c}\),其中 \(a,b,c\) 均为自然数且 \(c\gt 0\),定义域为 \((0,n]\)。

注意是右闭左开的。

这条线段随着 \(x\) 的增加,当碰到 \(x=k\) 的整线的时候,我们就对 \(v\) 做一次线性变换:\(v:=vR\);当碰到 \(y=k\) 的整线的时候,就对 \(v\) 做一次 \(v:=vU\) 的线性变换;如果是整点,则先做 \(U\) 后做 \(R\)。然后我们需要求出最后的 \(v\)。

显然我们最后只需要求出那个线性变换矩阵,设为 \(T\),然后 \(vT\) 就是答案。

为什么会发明出来这么奇怪的东西?其实有一个实际背景就容易理解了:我们可能维护的是一个变量 \(a\),这个 \(a\) 有一个变化规律,而我们要求 \(a\) 在某些时刻的和。

那么可以尝试构造一条线段:使得它碰到 \(y=k\) 的时候恰好就是 \(a\) 这个变量更新的时刻,然后线性变换 \(U\) 就等价于对变量 \(a\) 更新;当碰到 \(x=k\) 的时候恰好就是把 \(a\) 的当前值累加进答案的时刻,那么线性变换 \(R\) 就等价于 \(sum:=sum+a\) 这样的东西。


由于我们只关心 \((n,a,b,c,U,R)\),所以把这个六元组记作状态。

可以看出,一个 corner case 是 \(n=0\),此时 \(T=I\)。

可以看出,我们把整条线段上下平移整数格,不会改变结果,因此可以认为 \(b\in [0,c)\)。

当 \(a\ge c\) 的时候,考察 \((n,a,b,c,U,R)\) 和 \((n,a\bmod c,b,c,U,R)\) 两条线段的结果有什么区别,可以发现每一个 \(R\) 的前面都恰好多了 \(\lfloor \frac{a}{c} \rfloor\) 个 \(U\),所以可以重定义 \(R:=U^{\lfloor \frac{a}{c}\rfloor}R\) 然后变成 \(a\lt c\) 的情况。


当 \(a\lt c\) 的时候,感觉不是正常人能想到的角度。

注意到上面的线段对应这样一个东西:第 \(i\) 次 \(R\) 变换前共做了 \(\lfloor \frac{ai+b}{c} \rfloor\) 次 \(U\) 变换,记这个值为 \(s_i\)。

则其实就是:做 \(s_1\) 次 \(U\) 变换后做 \(R\) 变换,然后做 \(s_2-s_1\) 次 \(U\) 变换后再做 \(R\) 变换,然后做 \(s_3-s_1\) 次变换后再做 \(R\) 变换...,做 \(s_n-s_{n-1}\) 次变换后再做 \(R\) 变换。

注意到任何一个状态其实都和 \((s_1,s_2,...,s_n)\) 这个序列形成一一对应。

换个视角:第 \(i\) 次 \(U\) 变换前做了几次 \(R\) 变换!?

如果第 \(j\) 次 \(R\) 变换在第 \(i\) 次 \(U\) 变换前,则意味着:

\[aj+b\lt ci \\ j\lt \frac{ci-b}{a} \\ j\le \lfloor \frac{ci-b-1}{a} \rfloor \]

如果我们拿一条 \(y=\frac{cx-b-1}{a}\) 的线段,然后交换一下 \(U,R\),好像两者就等价了。

当然这个只是大体思路,我们会发现有很多锅,最直接的:我们这里 \(-b-1\) 是个负数啊,第二个:新的 \(n\) 取值是多少,第三个:如果最后一个 \(U\) 后面还有 \(R\) 咋办。

首先解决第三个问题,由于 \(m=\lfloor \frac{an+b}{c} \rfloor\) 是原线段最后一次执行 U 变换的位置,所以第 \(m\) 次 \(U\) 变换之后的 \(R\) 都不会被统计进去,我们知道第 \(m\) 次 \(U\) 变换之前的 \(R\) 变换次数是 \(\lfloor \frac{cm-b-1}{a}\rfloor\),所以最后额外乘上 \(R^{n-\lfloor \frac{cm-b-1}{a} \rfloor}\) 作为修正即可。

然后第二个问题也得到了解决:算到 \(m\) 就够了捏。

第一个问题比较谔谔,注意到 \(c\gt b\),所以不妨把它变成 \(\frac{cx + (c-b-1)}{a}\),然后就从 \((0,m]\) 变成了算 \((0,m-1]\),这样就行了。

此时看似三个问题都解决了,但是我们缺的 \((0,1]\) 这块的线性变换谁给我补啊?

发现这个特判是容易的,在递归的开头乘上 \(R^{\lfloor \frac{c-b-1}{a} \rfloor}\times U\) 即可,也就是把第一个 \(U\) 和它之前的 \(R\) 拿出来特殊算(注意上一个特判是挂在递归结束后面的)。

设一次矩阵乘法的复杂度是 \(O(T)\) 则复杂度看上去是 \(O(T\log^2\max\{n,c\})\) 的,但是通过一些分析可以发现其实是 \(O(T\log\max\{n,c\})\) 的,太困了有空补。

而且发现其实不一定是矩阵乘法(线性变换),只要有结合律就能捣鼓一下了啊。还能解决我们类欧的所有问题,有空补。

题有空补一个。

标签:lfloor,frac,变换,欧几里得,rfloor,线段,线性变换,万能
From: https://www.cnblogs.com/Cry-For-theMoon/p/17489992.html

相关文章

  • 万能欧几里得算法
    问题有一条直线\(y=\frac{Px+K}{Q}\),其中\(P\ge0\)且\(0\leK<Q\)。有两种操作\(U,R\),从左到右扫描这条直线在\((0,L]\)中的部分,若直线跨越了\(y=k(k\in\mathbb{Z})\)这条直线,则执行\(U\)操作;若直线跨越了\(x=k(k\in\mathbb{Z})\)这条直线,则执行\(R\)操作。若......
  • 万能欧几里得 学习笔记
    题目先放板子:求\(\sum\limits_{x=1}^{L}{A^xB^{\lfloor\frac{Px+R}{Q}\rfloor}}\),其中\(L,P,Q,R\leq10^{18}\)现在看来这个问题比较棘手,不过我们可以先从一些简单的东西入手。思想考虑这样一条直线\(y=\frac{Px+R}{Q}(0\leqR<Q)\),将它在平面直角坐标系中画出来......
  • 万能欧几里得算法
    从这篇博客学的:link。解决这样的一类问题:有一条直线\(y=\frac{Px+B}{Q}\),其中\(x\in(0,L],\midB\mid<Q\),当直线穿过一条形如\(y=h(h\in\mathbf{Z})\)的直线的时候进行\(U\)操作,穿过一条形如\(x=k(k\in\mathbf{Z})\)的直线进行\(R\)操作,如果经过了一个整点就进......
  • 万能函数SUMPRODUCT超实用的10种经典用法
    Excel函数100问Excel员工管理信息+进销存+应收账款+工资管理等系统课程Excel中有不少万能函数,一个函数能顶多个函数,例如VLOOKUP、OFFSET、SUBTOTAL、AGGREGATE、SUMPRODUCT等。它们各有专长,功能都非常强大,且受人追捧,今天Excel办公小课堂来给大家介绍其中的SUMPRODUCT函数,朴实低调,不......
  • c++关于 左右值 和 左右值引用 及 函数参数(万能引用,引用折叠,forward完美转发)
    左右值和左右值引用是有区别的。左右值是指对变量类别的区分,左值是有地址的值,可以长期存在;而右值是将亡值,是临时量,没有名字。而左右值引用是指变量的类型,如int&,int&&等,下面举一个例子:voidfunc(int&p){cout<<"&p"<<endl;return;}voidfunc(int&&p){......
  • 万能的Python爬虫模板来了
    Python是一种非常适合用于编写网络爬虫的编程语言。以下是一些Python爬虫的基本步骤:1、导入所需的库:通常需要使用requests、BeautifulSoup、re等库来进行网络请求、解析HTML页面和正则表达式匹配等操作。2、发送网络请求:使用requests库发送HTTP请求,获取目标网页的HTML源代码。3、解......
  • Permute 3 Mac(万能格式转换工具) v3.10.2中文版
    Permute3Mac是一款功能强大的万能格式转换工具,专为macOS系统设计。它可以帮助用户轻松、快速地将音频、视频和图像文件转换成各种格式,以满足用户不同的需求。→→↓↓载Permute3MacPermute3Mac支持多种文件格式的导入和输出,包括MP4、MOV、MKV、AVI、FLAC、MP3、PNG......
  • 欧几里得算法求最大公约数
    欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数假如需要求18和30两个正整数的最大公约数:调用函数:print(gcd(18,30)),a,b值变化如下a    b30÷18=1……1218÷12=1……......
  • 数论-裴蜀定理-扩展欧几里得算法
    裴蜀定理对于任意的整数a、b,都存在一对整数x、y(注意x和y可以是负整数),使得\(ax+by=gcd(a,b)\)成立。或者可以这样描述:对方程\(ax+by=c,(a,b,c∈Z)\),只有满足\(gcd(a,b)|c\)(即a和b的最大公约数可以整除c),方程才有整数解。扩展欧几里得算法的证明已知\(gcd(a,b)=gcd(b,a\%b)\)......
  • 类欧几里得算法与万能欧几里得算法
    类欧几里得算法与万能欧几里得算法前置知识\(\lfloor\frac{a}{b}\rfloor\)表示\(a\)除以\(b\)向下取整的结果。在一定情况下,我们希望将带有「向下取整」的不等式转化为不带有「向下取整」的不等式。方便起见,在下面列出其公式,其中\(a,b,c,d\)均为整数:\[c\le\left......