算法基础---数学知识


文章目录

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

一、质数

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<int> get_divisors(int x)
{
    vector<int> 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<int> get_divisors(int x)
{
    vector<int> 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<int, int> 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<int, int> 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 Apache Flink 的实时计算数据流业务引擎在京东零售的实践和落地

摘要&#xff1a;本文整理自京东零售-技术研发与数据中心张颖&闫莉刚在 ApacheCon Asia 2022 的分享。内容主要包括五个方面&#xff1a; 京东零售实时计算的现状实时计算框架场景优化&#xff1a;TopN场景优化&#xff1a;动线分析场景优化&#xff1a;FLINK 一站式机器学…

【Linux】写一个基础的bash

头文件#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> #include<sys/stat.h> #include<string.h> #include<pwd.h> #include<dirent.h>分割输入的命令串字符串或参数内容为空则退出strtok( ,…

【MySQL】数据类型

目录 一、数据类型分类 二、数值类型 bit&#xff1a; tinyint&#xff1a; ​编辑 smallint&#xff1a; memdiumint&#xff1a; int&#xff1a; bigint&#xff1a; float&#xff1a; ​编辑 decimal&#xff1a; 三、文本类型 char&#xff1a; 字符的概念&a…

出入了解——Vue.js

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

技术掉:PDF显示,使用pdf.js

PDF 显示 场景&#xff1a; 其实直接显示 pdf 可以用 iframe 标签&#xff0c;但产品觉得浏览器自带的 pdf 预览太丑了&#xff0c;而且无法去除那些操作栏。 解决方案&#xff1a;使用 pdf.js 进行显示 第一步&#xff1a;引入 pdf.js 去官网下载稳定版的 pdf.js 文件 然后…

ElasticSearch-第二天

目录 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 DSL概述 无查询条件 叶子条件查询 模糊匹配 match的复杂用法 精确匹配 组合条件查询(多条件查询) 连接查询(多文档合并查询) 查询DSL和过滤DSL 区别 query DSL filter DSL Query方式查…

使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

兄弟们天天看基础看腻了吧 今天来分享一下如何使用Python突破某网游游戏JS加密限制&#xff0c;进行逆向解密&#xff0c;实现自动登录。 逆向目标 目标&#xff1a;某 7 网游登录主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29tLw接口&#xff1a;aHR0cHM6Ly9teS4zNy5jb20vYXBpL…

Vue的命令式和声明式的概念

1.命令式框架(jQuery) 这里有个小例子&#xff1a; 1.获取id为app的div标签 2.设置他的文本内容是hello&#xff0c;world 3.为其绑定点击事件 4.当点击时候弹出提示ok 1.首先我们通过$来活动app的标签 $(#app)//获取id为app的标签 2.然后通过text来讲内容设置为hello&am…

Sentinel 授权规则规则持久化

本篇博客我们来学习授权规则&#xff0c;授权规则是对请求者的一种身份的判断。 1、授权规则 授权规则是对请求者的身份做一个判断。你有没有权限来访问我&#xff1f;那就有人可能会说这个功能&#xff0c;好像以前我们在学习微服务的时候讲过网关他不就是把门的吗&#xff1…

云上办公系统项目

云上办公系统项目1、云上办公系统1.1、介绍1.2、核心技术1.3、开发环境说明1.4、产品展示后台前台1.5、 个人总结2、后端环境搭建2.1、建库建表2.2、创建Maven项目pom文件guigu-oa-parentcommoncommon-utilservice-utilmodelservice-oa配置数据源、服务器端口号application.yml…

springboot车辆充电桩

sprinboot车辆充电桩演示录像2022开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;ecli…

文法和语言的基本知识

一、什么形式化的方法用一套带有严格规定的符号体系来描述问题的方法二、什么是非形式化的方法对程序设计语言的描述从语法、语义和语用三个方面因素来考虑所谓语法是对语言结构定义所谓语义是描述了语言的含义所谓语用则是从使用的角度去描述语言三、符号串字母表和符号串字母…

vue基于vant封装可精确到秒的时间选择器

前言 在移动开发中&#xff0c;时间选择的控件比比皆是&#xff0c;但却鲜有类似的组件可以精确到秒级别的&#xff0c;官方可能是考虑到小屏幕手机的显示问题&#xff0c;也可能是使用的场景寥寥无几&#xff0c;但是少不代表没有&#xff0c;所以最近花了点时间基于 vant 组件…

011+limou+C语言深入知识——(3)“字符串函数”和“字符分类函数”和“内存操作函数”以及“部分库函数的模拟实现”

一、字符串库函数 001、求字符串长度strlen size_t strlen ( const char * str );注意size_t是一个无符号类型&#xff0c;没有正负 #include <stdio.h> #include <string.h> int main() {char*str1 "abcdef";strcmpchar*str2 "bbb";if( …

《Roller: Fast and Efficient Tensor Compilation for Deep Learning》

《Roller: Fast and Efficient Tensor Compilation for Deep Learning》 用于深度学习 快速高效的张量编译器 作者 微软亚洲研究院以及多伦多大学等多所高校 摘要 当前编译为了产生高效的kernel时&#xff0c;搜索空间大&#xff0c;通常使用机器学习的方法 找到最优的方案…

【测试开发篇3】软件测试的常用概念

目录 一、软件测试的生命周期(5个步骤) ①需求分析(两个角度) 用户角度&#xff1a; 开发人员的角度&#xff1a; ②测试计划 ③测试设计、测试开发 ④执行测试 ⑤测试评估 二、软件测试贯穿项目的整个生命周期的体现 需求分析阶段 计划阶段 设计阶段 编码阶段 …

Keil5安装和使用小记

随着keil版本的更新&#xff0c;一些使用问题一随之产生。本文针对安装目前最新版本keil软件和使用问题做一些总结。 目录1 Keil5下载&安装1.1 官网下载链接1.2 软件安装1.2.1 安装说明1.2.2 关于 51 和 ARM 共存的问题1.3 软件破解2 pack包安装 & 破解2.1 下载2.2 安装…

智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)

摘要&#xff1a;智能生活垃圾检测与分类系统用于日常生活垃圾的智能监测与分类&#xff0c;通过图片、视频和摄像头识别生活垃圾&#xff0c;对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数&#xff0c;以协助垃圾环保分类处理。本文详细介绍基于YOLO…

找一找马里奥-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第110讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

《Linux的权限》

本文主要对linux的一些基本权限进行讲解 文章目录前言Linux权限&#xff08;1&#xff09;权限的概念&#xff08;2&#xff09;linux下用户分类(root,普通)(3)linux的文件属性文件属性的分类文件权限修改文件权限1、chmod2、chown和chgrp3、fiile权限的三个重要的问题第一个问…