三十四、数学知识——约数(试除法 + 约数个数 + 约数之和 + 欧几里得算法)

news2024/11/27 18:35:03

约数相关算法主要内容

  • 一、基本思路
    • 1、定义
    • 2、试除法——求一个数的所有约数
    • 3、约数个数
    • 4、约数之和
    • 5、欧几里得算法——辗转相除法(求解最大公约数)
  • 二、Java、C语言模板实现
  • 三、例题题解

一、基本思路

1、定义

  • 约数:
    • 约数是指一个数(因数)能整除另一个数的正整数,也称为因数
  • 举例:
    • “||”表示整除,a||b,即为 a 整除 b ,则,b/a为一个整数。

2、试除法——求一个数的所有约数

  • (d || n) ==> (n/d || n) ==> (d <= n/d) ==> (d <= sqrt(n))
  • 其中 d 与 n/d 都是 n 的约数,并且成对出现,我们需要成对储存
  • 但是需要特判一种情况—— i ?= n/i

3、约数个数

  • 质因数(正整数)分解定理:
    在这里插入图片描述
  • 约数个数定理:
    在这里插入图片描述
  • 问题:是否可以用试除法求解约数个数?
    • 理论上暴力求解可以,但是稍微大一点的数就会极容易溢出。

4、约数之和

  • 约数之和定理:
    在这里插入图片描述
  • 求解技巧:
    在这里插入图片描述

5、欧几里得算法——辗转相除法(求解最大公约数)

  • 基本性质:
    • (d||a , d||b) ⇒ (d||ax+by);
  • 核心原理:
    • (a, b)代表求解 a,b的最大公约数
    • (a, b) = (b , a mod b)
  • 欧几里得算法原理证明:

在这里插入图片描述

二、Java、C语言模板实现

// java 模板
// 1、试错法求解约数
static void getDiv(int n){
  PriorityQueue<Integer> q = new PriorityQueue<Integer>();        
  // 优先队列,Integer已经实现了Comparable接口,可以实现自动排序
  int count = 0;
  for(int i = 1; i <= n/i; i++){         // i 与 n/i 成对存在,能成为n的约数,那么n/i也可以是
     if(n % i == 0){                     // 满足整除条件,则为约数
         q.add(i);
         count++;
         if(i != n/i){            // 如果满足条件,那么就是与之对应的另一对约数,不满足则重复了
               q.add(n/i);
               count++;
         }
     }
  }
        
 for(int i = 0; i < count; i++){
     System.out.print(q.poll() + " ");
  }   
}

// 2、约数个数求解
for(int ii = 0; ii < n; ii++){
   int x = Integer.parseInt(reader.readLine());
            
   // 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数
   for(int i = 2; i <= x/i; i ++){
       while(x % i == 0){
            x /= i;
            map.put(i, map.getOrDefault(i, 0) + 1);
       }
   }
            
   if(x > 1){
      map.put(x, map.getOrDefault(x, 0) + 1);
   }
}
        
   long res = 1;
        
   for(int value : map.values()){
       res = res * (value + 1) % Mod;          
       / 此处一边相乘,一边mod,是因为一旦数字变大,就会导致溢出,影响最后的结果
   }

// 3、约数之和求解
for(int ii = 0; ii < n; ii++){
   int x = Integer.parseInt(reader.readLine());
            
   // 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数
   for(int i = 2; i <= x/i; i ++){
      while(x % i == 0){
           x /= i;
           map.put(i, map.getOrDefault(i, 0) + 1);
      }
   }
            
   if(x > 1){
      map.put(x, map.getOrDefault(x, 0) + 1);
   }
        
   // map 中存储的是键值对————质因数pi与质数ai
        
   long res = 1;
        
   for(int key : map.keySet()){
      long t = 1;
      int value = map.get(key);
            
      while(value-- > 0){
          t = (t * key + 1) % Mod;        // 进行取模运算是为了防止溢出
      }
            
      // 此处模仿了 p^0 + p^1 +...+p^a
      // t = 1;
      // t = p + 1;
      // t = p^2 + p + 1;
      // t = p^3 + p^2 + p + 1;
            
     res = res*t % Mod;
  }

// 4、最大公约数————欧几里得算法
static int gcd(int a, int b){
    // 用到了递归思想 + 欧几里得算法公式
    return b != 0 ? gcd(b, a % b) : a;      // 应该是b不等0的时候呀,满足第一个表达式,等于0满足第二个表达式
}

// C++ 模板,由yxc实现
// 1、试错法求解约数
试除法求所有约数 —— 模板题 AcWing 869. 试除法求约数
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、约数个数求解  约数之和求解
约数个数和约数之和 —— 模板题 AcWing 870. 约数个数, AcWing 871. 约数之和
如果 N = p1^c1 * p2^c2 * ... *pk^ck
约数个数: (c1 + 1) * (c2 + 1) * ... * (ck + 1)
约数之和: (p1^0 + p1^1 + ... + p1^c1) * ... * (pk^0 + pk^1 + ... + pk^ck)

// 3、最大公约数————欧几里得算法
欧几里得算法 —— 模板题 AcWing 872. 最大公约数
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

三、例题题解

在这里插入图片描述

// java题解实现
import java.util.*;

public class Main{
    
    
    static void getDiv(int n){
        PriorityQueue<Integer> q = new PriorityQueue<Integer>();        
        // 优先队列,Integer已经实现了Comparable接口,可以实现自动排序
        int count = 0;
        for(int i = 1; i <= n/i; i++){          // i 与 n/i 成对存在,能成为n的约数,那么n/i也可以是
            if(n % i == 0){                     // 满足整除条件,则为约数
                q.add(i);
                count++;
                if(i != n/i){                   // 如果满足条件,那么就是与之对应的另一对约数,不满足则重复了
                    q.add(n/i);
                    count++;
                }
            }
        }
        
        for(int i = 0; i < count; i++){
            System.out.print(q.poll() + " ");
        }
        System.out.println();
        
    }
    
    
    public static void main(String[] args){
        Scanner in  = new Scanner(System.in);
        
        int n = in.nextInt();
        
        for(int i = 0; i < n; i++){
            int ai = in.nextInt();
            getDiv(ai);
        }
    }
}

在这里插入图片描述

import java.util.*;
import java.io.*;

public class Main{
    static long Mod = (long)1e9 + 7;
    
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        HashMap<Integer,Integer> map = new HashMap<>();     
        // 用HashMap是因为键值key是唯一的,也就意味着我们先将每个数分解成质因数和指数形式即可
        // 因为质因数分解和本题中的各个数之间关系都是相乘
        // 因此在相同key的对应的不同指数就含有了不同数相乘信息
        
        int n = Integer.parseInt(reader.readLine());
        
        for(int ii = 0; ii < n; ii++){
            int x = Integer.parseInt(reader.readLine());
            
            // 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数
            for(int i = 2; i <= x/i; i ++){
                while(x % i == 0){
                    x /= i;
                    map.put(i, map.getOrDefault(i, 0) + 1);
                }
            }
            
            if(x > 1){
                map.put(x, map.getOrDefault(x, 0) + 1);
            }
        }
        
        long res = 1;
        
        for(int value : map.values()){
            res = res * (value + 1) % Mod;          
            // 此处一边相乘,一边mod,是因为一旦数字变大,就会导致溢出,影响最后的结果
        }
        
        
        System.out.println(res);
    }
    
}

在这里插入图片描述

import java.util.*;
import java.io.*;

public class Main{
    static long Mod = (long)1e9 + 7;
    
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        HashMap<Integer,Integer> map = new HashMap<>();     
        // 用HashMap是因为键值key是唯一的,也就意味着我们先将每个数分解成质因数和指数形式即可
        // 因为质因数分解和本题中的各个数之间关系都是相乘
        // 因此在相同key的对应的不同指数就含有了不同数相乘信息
        
        int n = Integer.parseInt(reader.readLine());
        
        for(int ii = 0; ii < n; ii++){
            int x = Integer.parseInt(reader.readLine());
            
            // 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数
            for(int i = 2; i <= x/i; i ++){
                while(x % i == 0){
                    x /= i;
                    map.put(i, map.getOrDefault(i, 0) + 1);
                }
            }
            
            if(x > 1){
                map.put(x, map.getOrDefault(x, 0) + 1);
            }
        }
        
        // map 中存储的是键值对————质因数pi与质数ai
        
        long res = 1;
        
        for(int key : map.keySet()){
            long t = 1;
            int value = map.get(key);
            
            while(value-- > 0){
                t = (t * key + 1) % Mod;        // 进行取模运算是为了防止溢出
            }
            
            // 此处模仿了 p^0 + p^1 +...+p^a
            // t = 1;
            // t = p + 1;
            // t = p^2 + p + 1;
            // t = p^3 + p^2 + p + 1;
            
            res = res*t % Mod;
        }
        
        
        System.out.println(res);
    }
    
}

在这里插入图片描述

import java.util.*;
import java.io.*;

public class Main{
    
    static int gcd(int a, int b){
        // 用到了递归思想 + 欧几里得算法公式
        return b != 0 ? gcd(b, a % b) : a;      // 应该是b不等0的时候呀,满足第一个表达式,等于0满足第二个表达式
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(in.readLine());
        
        for(int i = 0; i < n; i++){
            String[] str = in.readLine().split(" ");
            int a = Integer.parseInt(str[0]);
            int b = Integer.parseInt(str[1]);

            System.out.println(gcd(a, b));
        }
        
    }
}

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

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

相关文章

利用百度API进行植物识别

植物识别_拍照识别植物-百度AI开放平台百度AI植物识别,支持识别超过2万种通用植物和近8千种花卉&#xff0c;接口返回植物的名称&#xff0c;并获取百科信息&#xff0c;适用于拍照识图类APP中https://ai.baidu.com/tech/imagerecognition/plant 偶然看到的&#xff0c;不过真…

STM32F103C8T6+2.4寸SPI TFT触摸屏代码+标准库 项目开发

目录 模块清单&#xff1a; 模块介绍&#xff1a; 1&#xff1a;STM32F103C8T6 2&#xff1a;2.4寸SPI TFT触摸屏 项目结果展示 2.4寸 TFT SPI显示触摸屏 2.4寸 SPI TFT 显示触摸屏代码下载链接&#xff1a; (1条消息) 2.4寸SPITFT显示触摸屏资源-CSDN文库 模块清单&#x…

Vue后台管理系统【附源码】

登录 – 完成 路由拦截 – 完成 商品管理&#xff08;增加、编辑、搜索、删除&#xff09; – 完成 角色管理&#xff08;增加、编辑、搜索、删除、权限管理&#xff09; – 完成 交易订单&#xff08;增加、编辑、搜索、删除&#xff09; – 完成 用户管理&#xff08;增加、编…

在Centos Stream 9上Docker的实操教程 - 实操准备篇

在Centos Stream 9上Docker的实操教程 - 实操准备篇 认识Docker准备Centos Stream 9安装Docker更新仓库绕不开的HelloWorld结语 认识Docker 什么都要实操了&#xff0c;你还不知道Docker是什么&#xff1f;网上关于Docker的介绍一搜一大把&#xff0c;博主就不必浪费时间去侃侃…

ESP32-OTA

文章目录 1. 什么是OTA&#xff1f;2. OTA的基本原理3. ESP32远程OTA步骤&#xff1a;3.1 将需要升级的程序放在该目录下3.2 启动HTTP服务器3.3 配置3.4 烧录程序3.5 上电测试ESP32端 4. 问题&#xff1a;5. 通过命令控制OTA6. 参考&#xff1a; 1. 什么是OTA&#xff1f; OTA…

如何用 GPT-4 帮你写游戏(以24点游戏举例)

目录 给我一个24点游戏 游戏规则 GPT给的代码 ​改进 再改进 最近呢掀起了一阵GPT-4的热潮&#xff0c;很多人都想用GPT-4&#xff0c;这里呢我就打一个广告&#xff08;嘿嘿&#xff09;&#xff0c;如果不知道国内如何使用GPT的&#xff0c;可以看看这个博客&#xff1a;G…

STC89C52+DHT20设计的环境温湿度检测仪

一、项目背景 本项目基于STC89C52单片机和DHT20温湿度传感器,实现了一款环境温湿度检测仪。通过传感器采集环境的温度和湿度数据,利用IIC接口的OLED显示屏显示出来,便于用户实时监测环境温湿度状态。 在现代社会,人们对环境温湿度的要求越来越高。无论是工作场所还是居住…

局部特征匹配(LoFTR) 基于全局匹配的光流学习(GMFlow)

文章目录 特征匹配&#xff08;稀疏匹配与稠密匹配&#xff09;《LoFTR: Detector-Free Local Feature Matching with Transformers》【CVPR21】《GMFlow: Learning Optical Flow via Global Matching》【CVPR22】光流的定义第一个问题第二个问题方法该框架下存在的一个问题 Pr…

智慧园区管理平台优势详解

随着数字化和智能化的时代到来&#xff0c;越来越多的园区开始使用智慧园区管理平台来提高管理效率&#xff0c;降低管理成本和提升服务质量。智慧园区管理平台是一种通过智能化技术与物联网技术进行连接&#xff0c;对园区进行综合管理、智能化监控的信息化平台。下面将详细介…

大数据:云平台,阿里云VPC创建,创建安全组,云服务器ECS,

大数据&#xff1a;云平台 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&…

Seata之@GlobalTransactional验证

下订单 -> 减库存 -> 扣余额 -> 改&#xff08;订单&#xff09;状态 1.数据库初始情况&#xff1a; 2.正常下单 http://localhost:2001/order/create?userId1&productId1&count10&money100 3.超时异常&#xff0c;没加GlobalTransactional 模拟Accou…

RabbitMQ系列(24)--RabbitMQ集群搭建

前言&#xff1a;当RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量&#xff0c;那如果应用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机RabbitMQ服务的性能不…

阿里云ECS部署chat-web代理访问

1、ECS服务器申请 使用阿里云账号购买了一个美国&#xff08;弗吉尼亚&#xff09;的2C/2G的CentOS7.9 x64服务器。 2、系统版本升级 CentOS7.9默认的python和pip版本都是3.6的&#xff0c;需要升级到3.9以上&#xff0c;升级步骤百度&#xff0c;大致如下&#xff1a; wget…

vue diff算法与虚拟dom知识整理(12) patch精细化比较新增子节点

上文中我们编写了patch函数中对相同节点的几种处理 将简单的都写完了 但还留下了最麻烦的子节点比较 既新旧节点都有子节点 需要 精细化比较 我们先将src下的入口文件index.js 代码改成这样 import h from "./snabbdom/h"; import patch from "./snabbdom/pat…

C++实现Canny边缘检测(原理+底层代码)

文章目录 一、算法原理二、环境配置三、算法详解3.1、数据结构 Mat3.2、高斯滤波器的C实现3.3、用一阶偏导有限差分计算梯度幅值和方向 三、项目实战&#xff1a;C实现Canny边缘检测 一、算法原理 canny边缘检测算法步骤&#xff1a; 1、使用高斯滤波器对图像进行平滑处理。 2、…

recurdyn履带问题

1.问题&#xff1a;整车履带仿真出错&#xff0c;车辆越障时遇到障碍物直接弹开 思路&#xff1a; 关于这类模型需要调节履带和地面之间的接触参数、Bushing force&#xff0c;还有驱动函数。 弹飞了是因为接触刚度太大了&#xff0c;调小一些&#xff0c;在100以内继续调节…

从代码角度理解DETR

一个cnn的backbone, 提图像的feature, 比如, HWC.同时对这个feature做position_embedding.然后二者相加 (在Transformer里面就是二者相加)输入encoder,输入decoder (这里有object queries.)然后接Prediction Heads, 比如分类和回归. 下面的代码参考自: https://github.com/fac…

单片机原理及应用——持续更新

目录 一、单片机概述 1、单片机简介 2、单片机的特点 3、MSC-51系列与AT89S5x系列单片机 &#xff08;1&#xff09;MSC-51系列单片机 &#xff08;2&#xff09;AT89S5x系列单片机 二、AT89S52单片机的片内硬件结构 1、AT89S52单片机的硬件组成 2、AT89S52单片机的引…

Springboot +spring security,OAuth2 四种授权模式概念

一.简介 这篇文章来讲下Spring Security OAuth2 四种授权模式。 二.什么是OAuth2 OAuth 2.0 是一种用于授权的开放标准&#xff0c;允许用户授权第三方应用程序访问他们的资源&#xff0c;例如照片、视频或其他个人信息。OAuth 2.0 提供了一些不同的授权模式&#xff0c;包括…

我有一个朋友,分享给我的字节跳动测试开发真题

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给小伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在3月中的时候他告诉我投递了简历&#xff0c;5月的时候经过了3轮面试收获…