【数学知识】一文学会算法中的数学知识(1.1)

news2024/9/25 15:21:49

目录

一.数论

1.质数

(1)质数的判断

(2)分解质因数(数=几个质数相乘)

(3)求1-n的所有质数    

 2.约数

(1)试除法求所有约数

(2)约数个数和约数之和 

(3)最大公约数(欧几里得算法 )


一.数论

1.质数

在大于1 的整数,只包含1和本身这两个约数,则称为质数(素数)  2 3 5 7 11 13 17

(1)质数的判断

试除法(优化)枚举到根号x   O(根号x)      

bool is_prime(int x)
{
    if (x < 2) return false;
    for (int i = 2; i <= x / i; i ++ )   //以前是i<x
        if (x % i == 0)                  //包含其他约数
            return false;
    return true;
}

(2)分解质因数(数=几个质数相乘)

void divide(int x)
{
    for (int i = 2; i <= x / i; i ++ )   //x/i即sqrt复杂度
        if (x % i == 0)  //i一定是质数
        {
            int s = 0;   //计数
            while (x % i == 0) x /= i, s ++ ;
            cout << i << ' ' << s << endl;
        }
    if (x > 1) cout << x << ' ' << 1 << endl;
    cout << endl;
}



//eg
//x=6
// 2  1
// 3  1

//x=3
// 3  1   这里用到了x>1语句,因为直接跳出for循环x/i,只能另外判断

(3)求1-n的所有质数 
   

埃式筛法O(nloglogn) 

先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
如图:

在这里插入图片描述

算法核心:把每个质数的所有倍数筛掉 

int primes[N], cnt;     // primes[]存储所有素数
bool st[N];         // st[x]存储x是否被筛掉  默认false


void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (st[i]) continue; //st如果是true 说明被筛过,那么它的倍数肯定被筛过,所以直接跳过
        
        //接下来对该质数的所有倍数进行筛选
        primes[cnt ++ ] = i;
        for (int j = i + i; j <= n; j += i)
            st[j] = true;
    }
}

 2.约数

什么是约数?
约数,又称因数。整数a除以整数b(b≠0),除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。

 

(1)试除法求所有约数

暴力来解决这个问题很简单,就是从1开始遍历到n即可

for(int i = 1; i <= x; i++)
    {
        if(x % i == 0) res.push_back(i);
    }

 通过对质数的学习,我们知道一个数的因数即约数是成对出现的,所以我们同样可以用试除法,计算小的约数,并将大的约数添加到答案里,注意判断一下两者是否相同避免重复即可。

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);
            } 

给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai。

输出格式

输出共 n 行,其中第 i 行输出第 i 个整数 ai 的所有约数。

数据范围

1≤n≤100,
2≤ai≤2×1e9

输入样例:

2
6
8


输出样例:

1 2 3 6 
1 2 4 8 
#include<iostream>
#include<algorithm>
#include<vector>
 
using namespace std;
 
int n;
 
int main()
{
    cin>>n;
    
    while(n--)
    {
        int x;
        cin >> 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());
        
        for (auto k : res) cout << k << ' ';
        cout << endl;
    }
    
    return 0;
}

 

(2)约数个数和约数之和 

在这里插入图片描述
如果一个数N分解质因数为 N = p1^c1 * p2^c2 * ... *pk^ck     (p为质数)
约数个数: (c1 + 1) * (c2 + 1) * ... * (ck + 1)

example   36=2*2*3*3=2^2   *   3^2

                  36的约数为  2^0*3^0   2^0*3^1  2^0*3^2  2^1*3^0  2^1*3^1 …………2^2*3^2

                  只需改变质因数的个数,就会多一个约束

                   一共(2+1)(2+1)=   9种

 

代码实现的思路:
1、在每次输入一个数时,分解其质因数,将其出现的次数保存起来;
2、遍历保存质因数的表,将每个质因数出现的次数+1再相乘即可(即约数个数公式)。

#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<vector>

using namespace std;

typedef long long LL;

const int N = 110, mod = 1e9+7;

int main(){
    int n;
    cin >> n;
    unordered_map<int,int> primes;
    // 每次将输入的数分解质因数,质因数放在primes中
    while (n -- )
    {
        int x;
        cin >> 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 p : primes) res = res*(p.second+1) % mod;
        cout << res << endl;
        return 0;
}

约数之和: (p1^0 + p1^1 + ... + p1^c1) * ... * (pk^0 + pk^1 + ... + pk^ck) 

对于约数个数那个式子,它所选取的括号里的每一个p也是不同的,即分解后的每一个乘积式子都可以看作一个数,这样我们就将所有约数的和求出了。 

//约数之和,则只用改这个for循环即可
for (auto prime : primes)
    {
        LL p = prime.first, a = prime.second;
        LL t = 1;
        while (a--) t = (t * p + 1) % mod;
        //还要算0次方,算0次方就直接加1了,然后从一次方算方便些
        /*计算一下:
        第一步:
        t = (t * a + 1)
        t=p1的一次方+p1的零次方;
        第二步:
        t = (t * a + 1)
        t=p1的二次方+p1的一次方+1=p1的二次方+p1的一次方+p1的零次方;
        */
        res = res * t % mod;
    }

(3)最大公约数(欧几里得算法 )

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

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

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

相关文章

全回显SSRF测试两则

之前遇到可回显SSRF&#xff0c;并没有怎么去深入&#xff0c;可能漏洞点支持file协议更偏向于任意文件读取&#xff0c;不会去思考可回显SSRF的深入利用&#xff1b;直到读了pmiaowu师傅的可回显SSRF直接搭建成了代理进行内网渗透&#xff0c;后面遇到了两个可回显SSRF&#x…

【Kafka】Kafka为什么快?

Kafka之所以快的原因有三个&#xff1a;顺序读写、页缓存、零拷贝。 顺序读写 Kafka依赖磁盘来存储和缓存消息。 在我们的印象中&#xff0c;磁盘的读写速度会比内存的读写速度慢&#xff0c;但这是在随机读写场景下的比较。 实际上&#xff0c;磁盘的顺序读写能力不容小觑&am…

Spring IoC注解开发

Component 组件 Controller 控制器 Service 业务 Repository 仓库 其实他们四个本质都一样&#xff0c;只不过另外三个是Component的别名&#xff0c;在不同层使用容易区分 首先需要加入aop依赖&#xff0c;如果你事先加入spring-context依赖&#xff0c;则会关联加入ao…

亚马逊、temu、速卖通、国际站卖家如何利用好测评补单这张王牌?

大家好我是亚马逊测评珑哥。 现在越来越多的跨境电商平台入局&#xff0c;目前跨境电商平台亚马逊、TEMU、ozon、ebay、wish、lazada、敦煌、shopee、速卖通、poshmark、阿里国际站、沃尔玛、newegg、美客多等跨境平台的卖家都在递增&#xff0c;大家都知道&#xff0c;随着各…

javaEE 初阶 — 第一个 servlet 程序

文章目录 Servlet 是什么第一个 Servlet 程序1 创建项目2 引入依赖3 创建目录结构4 代码编写5 打包程序6 部署7 验证 如何使用 tomcat 插件打包及部署1 什么是插件2 插件的安装3 插件的使用4 可能会出现的问题 Servlet 是什么 Servlet 是一种实现 动态页面 的技术&#xff0c;是…

DataX和MongoDB之间的数据导入导出案例

DataX和MongoDB之间的数据导入导出案例 文章目录DataX和MongoDB之间的数据导入导出案例0. 写在前面1. MongoDB前置知识1.1 基础概念详解1.1.1 数据库1.1.2 集合1.1.3 文档&#xff08;Document&#xff09;2. DataX 导入导出案例2.1 读取 MongoDB 的数据导入到 HDFS2.1.1 编写配…

模板的分离编译

目录 &#xff1a; 1.分离编译概念 2.模板是不支持分离编译的 3.报链接错误的原因 4.如何解决 ----------------------------------------------------------------------------------------------------------------------- 1.分离编译概念 一个程序由若干个源文件共同实现&a…

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

Eureka单机搭建

Eureka简介 Eureka Spring Cloud Eureka 是Netflix 开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力 Eureka3个角色 服务中心&#xff0c;服务提供者&#xff0c;服务消费者 Eureka Server&a…

(leetcode C语言)1. 两数之和 9. 回文数

目录 1. 两数之和 思路 代码 9. 回文数 思路 思路1 代码1 思路2 代码2 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只…

设计模式-创建型模式之建造者模式

5. 建造者模式5.1. 模式动机无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言&#xff0c;无须知道这些部件的装配细节&#…

linux系统安装和配置网关

Linux 目前国内 Linux 更多的是应用于服务器上&#xff0c;而桌面操作系统更多使用的是 Windows 安装linux虚拟机 网址 VMware下载网址 点击Workstation 16 Pro for Windows下载 安装CentOS centO下载网址 依次点击 7.6.1810/ isos/ x86_64/ CentOS-7-x86_64…

改善供应商关系的八种方法

与供应商保持良好关系的重要性有很多原因。最重要的是&#xff0c;它使每个人的日常工作更加愉快。它还可以为你获得更好的交易&#xff0c;有助于协作并增强商誉。 但是&#xff0c;每个供应商都是不同的&#xff0c;建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…

TypeScript(十二)模块

目录 引言 d.ts声明文件 declare关键字 全局声明 全局声明方式 全局声明一般用作 函数声明 在.ts中使用declare 外部模块&#xff08;文件模块&#xff09; 模块关键字module 声明模块 模块声明方式 模块通配符 模块导出 模块嵌套 模块的作用域 模块别名 内部…

机器学习:皮尔逊相关系数——影评相关性分析案例

机器学习&#xff1a;皮尔逊相关系数——影评相关性分析案例 文章目录机器学习&#xff1a;皮尔逊相关系数——影评相关性分析案例:rocket:1、皮尔逊相关系数概念及公式:rocket:2、案例代码部分皮尔逊&#xff08;pearson&#xff09;相关系数、 斯皮尔曼&#xff08;spearman&…

vue2 和 vue3 共存

1.共存的前置条件 1.1 之前全局安装的 vue2 或者 vue3 的脚手架进行卸载&#xff0c;使用 npm命令卸载vue2 npm uninstall vue-cli -g 再使用 vue -V 查看版本出现以下提示为卸载完成 vue3卸载要使用命令npm uninstall vue/cli -g 1.2 安装cnpm 在命令行中输入 npm install -…

java面试题(SpringBoot)

SpringBoot 1.什么是SpringBoot&#xff1f;有什么优点&#xff1f; springboot是spring的子项目&#xff0c;是spring组件的一站式解决方案&#xff0c;简化了使用的难度&#xff0c;简省了配置 优点&#xff1a; 容易上手&#xff0c;提升开发效率内置web容器管理第三方工…

第六章 物理层

数据通信基础 数据通信基本概念 消息与信息&#xff1b;消息是信息的载体 消息&#xff1a;人类能够感知的描述信息&#xff1a;抽象概念&#xff0c;可以理解为消息中所包含的有意义的内容 通信&#xff1a;一点精确或近似地再生另一点的信息信号&#xff1a;传递信息的载体…

提高客户忠诚度的 5 种方法

提高客户忠诚度是成功经营企业的最重要因素之一。忠诚的客户也更有可能向他们的朋友和家人推荐您的业务&#xff0c;从而开辟更多的收入来源。所以您需要将您的战略重点放在建立作为企业主的客户忠诚度上。 提高客户忠诚度的 5种方法 1.优先考虑客户服务 作为企业应该积极主动…

工赋开发者社区 | MES/MOM数据采集系统需求分析和总体设计

随着社会市场需求的不断变化&#xff0c;传统生产车间内的数据采集技术无法跟上市场变化的需求&#xff0c;容易出现数据记录滞后、实时监控困难等问题&#xff0c;造成了车间的生产效率低、产品质量低。在全球信息化的时代背景下&#xff0c;企业内的信息化管理可有效促进经济…