算法基础---数学知识
创始人
2025-05-30 15:45:50


文章目录

  • 质数
    • 试除法判定质数
    • 试除法分解质因数
    • 朴素筛法求质数
    • 埃氏筛法求质数
    • 线性筛法求质数
  • 约数
    • 试除法求所有约数
    • 试除法求所有约数之和
    • 约数个数和约数之和
    • 欧几里得算法

一、质数

1.试除法判定质数--O(sqrt(N))

原理:把从[2,n-1]中的每一个自然数作为除数来除n,如果n不能被其中的任意一个数整除,那么n就是素数。

优化:由于一个数的约数都是成对出现的。所以只需要枚举[2,sqrt(n)];

bool is_prime(int x)
{if (x < 2) return false;for (int i = 2; i <= x / i; i ++ )if (x % i == 0)return false;return true;
}

2.试除法分解质因数--O(logN)~O(sqrt(N))

原理:从[2,sqrt(n)]中枚举所有的质数,如果找到某一个素数i,则需要将n连续除以i得到m个i,然后将n中去除m个i的数,继续操作,如果最后一个数大于1,则得到最后一个质因子。

void divide(int x)
{for (int i = 2; i <= x / i; i ++ )if (x % i == 0){int s = 0;while (x % i == 0) x /= i, s ++ ;cout << i << ' ' << s << endl;}if (x > 1) cout << x << ' ' << 1 << endl;cout << endl;
}

3.朴素筛法求质数--O(NlogN)

原理:对于n个数,从2开始枚举,依次将其倍数删去,如果枚举到该数仍存在则该数一定为质数,因为例如一个数p,枚举到它时还存在,说明它不是2~p-1中任何数的倍数,即该数为质数。

int primes[N],cnt;
bool st[N];筛选出所有数的倍数
void get_primes(int n)
{for (int i = 2; i <= n; i++){if (st[i]) continue;primes[cnt++] = i;for (int j = i + i; j <= n; j += i) st[j] = true;//筛选出i的倍数}
}

4.埃氏筛法求质数--O(loglogN)

埃及筛法就是在朴素筛法的基础上,我们只用将质数的倍数删掉即可,因为一个合数可以写成几个质数的积,那么我们将所有质数的倍数删掉时,所有合数也被删掉了,这样可以将时间复杂度优化到O(nloglogn),可粗略看作O(n)。

优化:通过只筛选质数的倍数即可。

int primes[N],cnt;
bool st[N];void get_primes(int n)
{for (int i = 2; i <= n; i++){if (!st[i]){primes[cnt++] = i;for (int j = i + i; j <= n; j += i)st[j] = true;}}
}

5.线性筛法求质数

对于某一个合数n,其只会被自己的最小质因子给筛掉。

int primes[N],cnt;
bool st[N];void get_primes(int n) {for(int i = 2; i <= n; i++) {if(!st[i]) primes[ctn++] = i;for(int j = 0; primes[j] <= n / i; j++) {st[primes[j] * i] = true;// 当下面的if条件成立时, primes[j]一定是i的最小质因子if(i % primes[j] == 0) break;}}
}

二、约数

1.试除法求所有约数--O(sqrt(N))

原理:假设p是x的一个约数,那么x/p一定也是它的约数,所以只需枚举2 到 sqrt(n)的约数,并且可以直接通过运算获得sqrt(n) 之后对应的那个约数。        

vector get_divisors(int x)
{vector res;for (int i = 1; i <= x / i; i ++ )if (x % i == 0){res.push_back(i);if (i != x / i) res.push_back(x / i);}sort(res.begin(), res.end());return res;
}

2.试除法求所有约数之和

vector get_divisors(int x)
{vector res;for (int i = 1; i <= x / i; i ++ )if (x % i == 0){res.push_back(i);if (i != x / i) res.push_back(x / i);}sort(res.begin(), res.end());return res;
}

3.约数个数和约数之和

unordered_map primes;//求约数个数
void get_divisors_numbers(int x)
{    for(int i=2;i<=x/i;i++)while (x % i == 0){x /= i;primes[i]++;}if (x > 1) primes[x]++;LL res = 1;for (auto prime : primes) res = res * (prime.second + 1)%mod;cout << res << endl;
}
unordered_map primes;//求约数之和
void get_divisors_sumNumbers(int x)
{    for(int i=2;i<=x/i;i++)while (x % i == 0){x /= i;primes[i]++;}if (x > 1) primes[x]++;LL res = 1;for (auto prime : primes) {int p = prime.first, a = prime.second;LL t = 1;while (a--) t = (t * p + 1) % mod;res = res * t % mod;}cout << res << endl;
}

4.欧几里得算法

原理:辗转相除法原理是设两数为a、b(a>b),用gcd(a,b)表示a, b的最大公约数,r=a(mod b)为a除以b的余数,k为a除以b的商,即a÷b=k.....r。辗转相除法即是要证明gcd(a,b)=gcd(b, r)。辗转相除法,又名欧几里德算法。

int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}

相关内容

热门资讯

Docker等容器技术如何与移... 移动应用程序的开发面临着很多挑战,包括开发环境的设置、测试的困难、部署的复杂性等。由于...
【微服务】—— Nacos安装... 文章目录1. Windows安装1.1 下载安装包1.2 解压1.3 端口配置1.4 启动1.5 访...
【OpenGL】 为了理解这个函数我们需要先学习一些OpenGL的内容 OpenGL可视化 https://g...
hjr-详细说一下Redis集... Redis作用 缓存 一般我们用Redis做缓存,热点数据 击穿:访问到...
【蓝桥杯】 C++ 数字三角形... 文章目录题目描述输入描述输出描述实现代码解题思路注意点知识点 题目描述 上图给出了一个数字三角形。从...
VR全景展会丨探索未来,重塑现... 随着科技的不断发展,虚拟现实(VR)技术逐渐成为一个重要的...
C++数据类型 目录 C++基础数据类型 指针 指针类型 指针赋值 引用 参考:《深...
超实用!!! 三分钟将你的项目... 文章目录前言一、在项目中新增配置二、配置github page setting?三、如...
数据结构---队列 专栏:数据结构 个人主页:HaiFan. 专栏简介:这里是...
数字操作方法 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
Cartesi 2023 年 ... 查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在...
JavaWeb——jsp概述入... JSP定义:  在如下一个jsp文件里面有如下的代码  <%@ page content...
一切喜怒哀乐都来自于你的认知 01 有个学子,准备出国,父母请来清华的教授宁向东。请问教授࿱...
JAVA并发编程——synch... 引言         Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,...
git学习----3.21 未... 文章目录前言Git :一个分布式版本控制工具目标一、概述1.1 开发中的实际场景1.2...
Qt优秀开源项目之十七:QtP... QtPromise是Promises/A+规范的Qt/C++实现。该规范的译...
【前端八股文】JavaScri... 文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和...
海康硬盘录像机接入RTSP/o... EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供...
在混合劳动力时代如何避免网络安... 在混合劳动力时代如何避免安全网络风险 三年多来,混合工作一直是工作生活中不可或缺的一...
2023还不懂Jmeter接口... 这里介绍的Jmeter接口测试的的实战,如果文章内容没遇看懂的话,我这边...
基于4G/5G弱网聚合的多链路... 基于4G/5G多卡聚合(弱网聚合)的智能融合通信设备技术亮点 增强带宽提供可靠连接 通过将多个有线和...
如何使用Synplify综合v... 文章目录使用Synplify综合的好处synplify的教程方法1(无效)...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
2022年18个值得期待的Le... 有数百个独特的LearnDash附加组件,您可能很难选择您的LearnDash LMS...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...
javaweb高校行政办公自动... 本课题基于我国高校管理信息化建设现状,结合在实际工作中所遇到的问题和收获,...
一款专门为自动化测试打造的集成... 你好,我是不二。 随着行业内卷越来越严重,自动化测试已成为测试工程师的...
【go-zero】golang... 一、casbin 概览 1、casbin基本了解 casbin的GitHub:https://git...
现在开发低代码平台算晚吗? 现在开发低代码平台算晚吗?作为低代码的亲戚——零代码厂商,这篇就以“厂商...
【JavaWeb】书城项目(2... 222.书城项目-第三阶段:修改所有html页面为jsp页面 改成jsp页面之后&#x...