类欧几里得算法学习笔记

news2025/1/18 18:48:02

偶然发现了学长发给我的一个学长的学长也是我的学长的一个数论 p p t ppt ppt,先不着急复习莫反杜教筛,按这个顺序来吧

0.随便说说

前一阵子确实学习状态不是很好,我感觉我个人学习状态也是忽好忽坏的,不过只要在学习状态好的时候多学点感觉就可以学到很多东西。
看到学长之前发给我的 p p t ppt ppt感慨也很多,也跟学长聊了聊,这些知识都是别人高中甚至初中就学会的知识点,如果高中时候好好学 O I OI OI,会不会现在有不一样的未来呢。其实我对现在也很满意了,能做一个普通学校的普通的 A C M e r ACMer ACMer就已经很满足了,起码也在热爱的路上,希望能拿点成绩出来吧。

1.随便讲讲

类欧几里得算法可以在 O ( log ⁡ n ) O(\log{n}) O(logn)的时间复杂度解决如下形式的前缀和函数
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ f(a,b,c,n)=\sum_{i=0}^n \lfloor\frac{ai+b}{c}\rfloor f(a,b,c,n)=i=0ncai+b
这个式子的向下取整让我们很容易联想到数论分块,可惜数论分块不能解决这个问题,因此我们要用到类欧几里得算法。

前置知识:几个和向上向下取整有关的不等式

ok现在开始推导,分成两种情况,第一种是 a ≥ c a\ge c ac b ≥ c b\ge c bc,第二种是 a < c a<c a<c b < c b<c b<c
在这里插入图片描述
可以看到,第一种情况我们直接将 a , b a,b a,b缩小到了 c c c以下,第二种情况我们交换了 a , c a,c a,c的位置,数字对 ( a , c ) (a,c) (a,c)的变换与求解 g c d ( a , c ) gcd(a,c) gcd(a,c)时的变换相同,因此时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

2.代码实现

看起来复杂,但由于用到的是递归的思想,所以并不难
在这里插入图片描述

3.例题

AtCoder ABC283Ex Popcount Sum

题面
p o p c o u n t ( x ) = ∑ i = 0 log ⁡ 2 x ( x > > i ) & 1 = ∑ i = 0 log ⁡ 2 x ( ( x > > i ) − ( ( x > > i + 1 ) < < 1 ) ) = ∑ i = 0 log ⁡ 2 x ( ⌊ x 2 i ⌋ − 2 ⌊ x 2 i + 1 ⌋ ) popcount(x)=\sum_{i=0}^{\log_2^x}(x>>i)\&1=\sum_{i=0}^{\log_2^x}((x>>i)-((x>>i+1)<<1))=\sum_{i=0}^{\log_2^x}(\lfloor\frac{x}{2^i}\rfloor-2\lfloor\frac{x}{2^{i+1}}\rfloor) popcount(x)=i=0log2x(x>>i)&1=i=0log2x((x>>i)((x>>i+1)<<1))=i=0log2x(⌊2ix22i+1x⌋)

所以本题所求

∑ j m o d    m = r n p o p c o u n t ( j ) = ∑ j = 0 ⌊ n − r m ⌋ p o p c o u n t ( m j + r ) = ∑ j = 0 ⌊ n − r m ⌋ ∑ i = 0 log ⁡ 2 m j + r ( ⌊ m j + r 2 i ⌋ − 2 ⌊ m j + r 2 i + 1 ⌋ ) \sum_{j \mod m=r}^{n}popcount(j)=\sum_{j=0}^{\lfloor\frac{n-r}{m}\rfloor}popcount(mj+r)=\sum_{j=0}^{\lfloor\frac{n-r}{m}\rfloor}\sum_{i=0}^{\log_2^{mj+r}}(\lfloor\frac{mj+r}{2^i}\rfloor-2\lfloor\frac{mj+r}{2^{i+1}}\rfloor) jmodm=rnpopcount(j)=j=0mnrpopcount(mj+r)=j=0mnri=0log2mj+r(⌊2imj+r22i+1mj+r⌋)

= ∑ i = 0 log ⁡ 2 m j + r ∑ j = 0 ⌊ n − r m ⌋ ( ⌊ m j + r 2 i ⌋ − 2 ⌊ m j + r 2 i + 1 ⌋ ) = ∑ i = 0 log ⁡ 2 m j + r ( f ( m , r , 2 i , ⌊ n − r m ⌋ ) − 2 f ( m , r , 2 i + ! , ⌊ n − r m ⌋ ) ) =\sum_{i=0}^{\log_2^{mj+r}}\sum_{j=0}^{\lfloor\frac{n-r}{m}\rfloor}(\lfloor\frac{mj+r}{2^i}\rfloor-2\lfloor\frac{mj+r}{2^{i+1}}\rfloor)=\sum_{i=0}^{\log_2^{mj+r}}(f(m,r,2^i,\lfloor\frac{n-r}{m}\rfloor)-2f(m,r,2^{i+!},\lfloor\frac{n-r}{m}\rfloor)) =i=0log2mj+rj=0mnr(⌊2imj+r22i+1mj+r⌋)=i=0log2mj+r(f(m,r,2i,mnr⌋)2f(m,r,2i+!,mnr⌋))

前面一个 l o g log log ,计算 f f f 还有一个 l o g log log ,时间复杂度是 l o g log log 方的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline void read(ll &x){
    ll s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
    x=s*w;
}
ll f_gcd(ll a, ll b, ll c, ll n){
    ll res=n*(n+1)/2*(a/c)+(n+1)*(b/c);
    a%=c,b%=c;ll m=(a*n+b)/c;
    if(m==0)return res;
    return res+n*m-f_gcd(c,c-b-1,a,m-1);
}
ll t,n,m,r;
int main(){
    read(t);
    while(t--){
        read(n),read(m),read(r);
        ll k=log(n)/log(2),p=1,ans=0;
        for(ll i=0;i<=k;i++){
            ans+=f_gcd(m,r,p,(n-r)/m)-2*f_gcd(m,r,(p<<1),(n-r)/m);
            p<<=1;
        }
        printf("%lld\n",ans);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大麦链接源码 大麦一键生成订单截图

8.4最新版源码 更新了大麦链接模版 更新了大麦订单截图一键生成 下载源码&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

TM4C123的ROM函数和非ROM函数区别

前言 在开发TM4C123的时候&#xff0c;我看到ROM函数和非ROM函数。例如ROM_FPUEnable()和FPUEnable()函数&#xff0c;这两个就只是前缀不一样。有什么区别和不同&#xff1f; 相同点 ROM函数和非ROM函数的作用起始是一样的&#xff0c;比如上面的例子ROM_FPUEnable()和FPUEnab…

如何有效地扩展数据库服务器以满足日益增长的工作量

在当今以数据为驱动的世界中&#xff0c;企业面临着一个挑战&#xff0c;即在保证应用程序的最佳性能的同时&#xff0c;管理迅速增长的数据量。扩展数据库服务器在满足这些需求方面起着至关重要的作用。本篇博客将探讨各种策略&#xff0c;以有效地扩展数据库服务器&#xff0…

[C++]

C 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWorld 首先到官网下载并安…

P2824 [HEOI2016/TJOI2016] 排序(线段树)(内附封面)

[HEOI2016/TJOI2016] 排序 题目描述 在 2016 2016 2016 年&#xff0c;佳媛姐姐喜欢上了数字序列。因而她经常研究关于序列的一些奇奇怪怪的问题&#xff0c;现在她在研究一个难题&#xff0c;需要你来帮助她。 这个难题是这样子的&#xff1a;给出一个 1 1 1 到 n n n 的…

关于单测技术选型,聊聊我的思考

对于单测来说&#xff0c;目前常用的单测框架有&#xff1a; JUnitMockitoSpockPowerMockJMockitTestableMock 其中 JUnit 不支持 Mock&#xff0c;因此基本不会只用 JUnit&#xff0c;而是结合其他有 Mock 功能的框架一起使用。从知名度及使用率来说&#xff0c;Mockito 和 …

【基于HBase和ElasticSearch构建大数据实时检索项目】

基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据&#xff0c;解决海量数据存储和实时更新查询的问题&#xff1b;利用ElasticSearch作为HBase索引&#xff0c;加快大数据集中实时查询数…

干就完了

&#xff08;1&#xff09; ENIAC诞生于1946年。但安达信在1954年就拿计算机给通用电气公司算薪&#xff0c;这算计算机最早在工商业界的应用。 其实算薪这个事吧&#xff0c;严格意义来说是人力服务的BPO&#xff0c;只不过为了让这个算薪BPO项目更高效率更高质量更低成本地完…

无人机巢的作用及应用领域解析

无人机巢作为无人机领域的创新设备&#xff0c;不仅可以实现无人机的自主充电和电池交换&#xff0c;还为无人机提供安全便捷的存放空间。为了帮助大家更好地了解无人机巢&#xff0c;本文将着重解析无人机巢的作用和应用领域。 一、无人机巢的作用 无人机巢作为无人机技术的重…

模型优化调参方法介绍(Python代码)

模型算法在机器学习和深度学习中都发挥着自己的作用&#xff0c;但往往训练出来的模型效果不佳或稳定性不强&#xff0c;就需要对模型进行调优。一般来说&#xff0c;会从以下几个角度来优化模型。 1.优化数据维度 在需要对原始需求进行理解、准确定义好坏样本的前提下&#…

MySQL第六七弹,自连接等复杂查询,索引部分知识

一、&#x1f49b; 自连接&#xff1a;自己和自己笛卡尔积&#xff08;奇淫巧技&#xff0c;特殊场景很牛逼&#xff09; SQL&#xff1a;编写条件都是列和列之间的比较&#xff0c;但是SQL无法进行&#xff0c;行与行之间的比较。 如&#xff1a;显示所有java比计算机原理高的…

中电金信杜啸争:逐“数”兴业,智胜未来

在数字化转型大潮中&#xff0c;数据要素市场未来如何发展&#xff1f;作为天然具有大量数据应用场景和需求的金融行业&#xff0c;能否逐“数”兴业&#xff0c;实现“换道超车”&#xff1f; 本期分享由中电金信商业分析事业部总经理&#xff0c;中电金信数据研发委员会主席…

Cpp8 — 二叉搜索树

二叉搜索树&#xff08;搜索二叉树、二叉排序树&#xff09; 二叉搜索树又称二叉排序树&#xff0c;它要么是一棵空树&#xff0c;要么是具有以下性质的二叉树&#xff1a; 1.若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空&…

刷题笔记 day5

力扣 202 快乐数 首先来分析什么样的数是快乐数&#xff0c; 解题思路&#xff1a; 1&#xff09;定义快慢指针 &#xff1b; 2&#xff09;快指针走两步&#xff0c;慢指针走一步 &#xff1b;3&#xff09;两个指针相遇时判断相遇的数值是否为1。 怎样处理 取各分位数的平…

ReentrantLock源码解析和AQS常见问题分析

ReentrantLock和AQS常见问题分析 一、前言 本文利用ReentrantLock作为阅读AQS的切入口&#xff0c;通过问答的方式让大家更好的去理解今天要掌握的点&#xff0c;也欢迎大家说说自己的答案。 二、本文大纲 脑图是个很好的辅助记忆工具&#xff0c;也能提高自己的逻辑思维能…

计算机中数据的表示

计算机数据表示 送入计算机的数字&#xff0c;字母&#xff0c;符号等信息必须转换成0、 1组合的数据形式才能被计算机识别。 能够进行算术运算得到明确数值概念的信息成为计算机数值数据&#xff0c;其余的信息成为非数值数据。 从计算机本质的角度而言啊&#xff0c;它所处理…

《零基础入门学习Python》第077讲:Tkinter 模块:标准对话框

Tkinter 为了提供了三种标准对话框模块&#xff0c;它们分别是&#xff1a; messageboxfiledialogcolorchooser 注&#xff1a;这三个模块原来是独立的&#xff0c;分别是 tkMessageBox、tkFileDialog 和 tkColorChooser&#xff0c;需要导入才能使用。在 Python3 之后&#…

http和https的区别?(网络通讯)

HTTP&#xff1a; 超文本传输协议&#xff08;HTTP&#xff0c;HyperText Transfer Protocol&#xff09;是互联网上应用最为广泛的一种 网络协议 HTTPS&#xff1a; 是以安全为目标的 HTTP 通道&#xff0c;是 HTTP 的安全版。HTTPS 的安全基础是 SSL。 两者区别: 1、HTTPS …

Vue3_02 创建Vue3.0工程

1.使用 vue-cli 创建 ## 查看 vue/cli 版本&#xff0c;确保 vue/cli 版本在4.5.0以上 vue -V 或 vue --version## 安装或升级你的 vue/cli npm install -g vue/cli## 创建 vue create vue_test## 启动 cd vue-test npm run serve 2.使用 vite 创建 什么是vite?——新一代…

Golang之路---03 面向对象——接口与多态

接口与多态 何为接口 在面向对象的领域里&#xff0c;接口一般这样定义&#xff1a;接口定义一个对象的行为。接口只指定了对象应该做什么&#xff0c;至于如何实现这个行为&#xff08;即实现细节&#xff09;&#xff0c;则由对象本身去确定。   在 Go 语言中&#xff0c;…