首页 > 其他分享 >算术基本定理

算术基本定理

时间:2024-09-30 14:36:10浏览次数:7  
标签:基本 10 le 算术 定理 times int cdots alpha

一个整数可以被表示成若干质数的乘积。例如:\(48=2^4 \times 3, \ 49 = 7^2, \ 50 = 2 \times 5^2\)。

算术基本定理:设 \(a>1\),那么必有 \(a = p_1^{\alpha_1} p_2^{\alpha_2} \cdots p_s^{\alpha_s}\),其中 \(p_i \ (1 \le i \le s)\) 是两两不相同的质数,\(\alpha_i \ (1 \le i \le s)\) 表示对应质数的幂次。

朴素的分解质因数的时间复杂度和枚举约数一样都是 \(O(\sqrt{n})\)。

int decomposition(int x) {
    // 分解x,数组a记录所有质数,返回分解出来的质数数量
    int cnt = 0;
    for (int i = 2; i <= x / i; i++) {
        while (x % i == 0) {
            a[++cnt] = i;
            x /= i;
        }
    }
    if (x > 1) a[++cnt] = x;
    return cnt;
}

算术基本定理是处理整除性和数论函数的有力工具。

假定 \(a = p_1^{\alpha_1} p_2^{\alpha_2} \cdots p_s^{\alpha_s}\),有以下推论:

推论:\(d\) 是 \(a\) 的约数的充要条件是 \(d = p_1^{e_1} p_2^{e_2} \cdots p_s^{e_s}, \ 0 \le e_i \le \alpha_i, \ 1 \le i \le s\),即 \(d\) 中每个质数的幂次都不超过 \(a\)。

每个质因子上的幂次直接决定了两数之间的整除性。

例如 \(12 = 2^2 \times 3, \ 72 = 2^3 \times 3^2\),\(12\) 的每个质因子上的幂次都对应地不超过 \(72\) 的,因此 \(12 | 72\)。

推论:若 \(b = p_1^{\beta_1} p_2^{\beta_2} \cdots p_s^{\beta_s}\),这里允许某些 \(\alpha_i\) 或 \(\beta_i\) 为零,那么 \((a,b) = p_1^{\delta_1} p_2^{\delta_2} \cdots p_s^{\delta_s}, \ \delta_i = \min (\alpha_i, \beta_i), \ 1 \le i \le s\),以及 \([a,b] = p_1^{\gamma_1} p_2^{\gamma_2} \cdots p_s^{\gamma_s}, \ \gamma_i = \max(\alpha_i, \beta_i), \ 1 \le i \le s\)。

比如,\(10 = 2 \times 5, \ 16 = 2^4\),那么 \((10,16) = 2^{\min(1,4)} \times 5^{\min(1,0)} = 2^1 \times 5^0 = 2\),且 \([10,16] = 2^{\max(1,4)} \times 5^{\max(1,0)} = 2^4 \times 5^0 = 80\)。

另外,这个性质也是 \([a_1,a_2](a_1,a_2) = a_1a_2\) 的一种直接证明,以 \(10\) 和 \(16\) 为例:\((10,16)[10,16] = 2^{\min(1,4)} \times 5^{\min(1,0)} \times 2^{\max(1,4)} \times 5^{\max(1,0)} = 2^{\min(1,4) + \max(1,4)} \times 5^{\min(1,0) + \max(1,0)} = 2^{1+4} \times 5^{1+0}\),\(10 \times 16 = 2 \times 5 \times 2^4 = 2^{1+4} \times 5^{1+0}\)。

所以 \([a_1,a_2](a_1,a_2) = a_1a_2\) 的本质其实是 \(\min(\alpha,\beta) + \max(\alpha,\beta) = \alpha + \beta\)。

推论:用除数函数 \(\tau(a)\) 表示 \(a\) 的所有正约数的个数,则 \(\tau(a) = (\alpha_1+1) \cdots (\alpha_s + 1) = \tau(p_1^{\alpha_1}) \cdots \tau(p_s^{\alpha_s})\)。

相当于对于每个质因子上的幂次,可以取 \(0\) 到 \(\alpha_i\) 中的任意整数,共 \(\alpha_i + 1\) 个,由乘法原理可以直接得出,约数的个数。

比如,\(a = 2^7 \times 3^8 \times 5^9\),则 \(a\) 的正约数个数等于 \((7+1)(8+1)(9+1) = 8 \times 9 \times 10 = 720\)。

推论:用除数和函数 \(\sigma(a)\) 表示 \(a\) 的所有正约数的和,则 \(\sigma(a) = \dfrac{p_1^{\alpha_1 + 1} - 1}{p_1 - 1} \cdots \dfrac{p_s^{\alpha_s + 1} - 1}{p_s - 1} = \sigma(p_1^{\alpha_1}) \cdots \sigma(p_s^{\alpha_s})\)。

比如,\(a = 120 = 2^3 \times 3 \times 5\) 的因子分别是 \(1,2,3,4,5,6,8,10,12,15,20,24,30,40,60,120\)。

用等比数列求和公式 \(\dfrac{p_1^{\alpha_1 + 1} - 1}{p_1 - 1} = 1 + p_1 + \cdots + p_1^{\alpha_1}\) 展开计算 \(\sigma(120) = \dfrac{2^4 - 1}{2 - 1} \dfrac{3^2-1}{3-1} \dfrac{5^2-1}{5-1} = (2^3+2^2+2^1+1)(3^1+1)(5^1+1)\),把括号展开,发现 \(\sigma(120) = (2^3+2^2+2^1+1)(3^1+1)(5^1+1) = 120+24+40+8+60+12+20+4+30+6+10+2+15+3+5+1\),等于之前的约数之和。

公式是乘法原理在乘法分配律上的体现,也展现了质因子之间的独立性。

例题:P1069 [NOIP2009 普及组] 细胞分裂

给定 \(m_1 \ (m_1 \le 30000), \ m2 \ (m2_le 10000)\) 和 \(n \ (n \le 10000)\) 个正整数 \(S_i \ (S_i \le 2 \times 10^9)\)。设 \(x_i\) 是最小的使得 \(m_1^{m_2} | S_i^{x_i}\) 的整数(也有可能不存在),求 \(\min(x_1, \cdots, x_n)\)。

分析:\(m_1^{m_2}\) 很大,难以直接处理。考虑 \(m_1 = p_1^{\alpha_1} p_2^{\alpha_2} \cdots p_s^{\alpha_s}\),那么 \(m_1^{m_2} = p_1^{\alpha_1 m_2} p_2^{\alpha_2 m_2} \cdots p_s^{\alpha_s m_2}\)。接下来只需要解决题意中的 \(x_i\) 的求解。

当 \(m_1^{m_2}\) 中的每个质因子的幂次都不超过 \(S_i^{x_i}\) 时,\(m_1^{m_2} | S_i^{x_i}\) 成立。\(S_i^{x_i}\) 中的质因子是否出现由 \(S_i\) 决定,而质因子出现了几次主要由 \(x_i\) 决定。若 \(S_i = p_1^{e_1} p_2^{e_2} \cdots p_s^{e_s} p_{s+1}^{e_{s+1}} \cdots p_{s+r}^{e_{s+r}}\),其中 \(p_{s+1}\) 到 \(p_{s+r}\) 表示与 \(m_1\) 无关的质因子,那么 \(x_i\) 应该使得对于所有 \(1 \le j \le s\),满足 \(\alpha_j m_2 \le e_j x_i\)。

所以从 \(m_1\) 的每个质因子 \(p_j\) 出发:如果这个 \(S_i\) 不能整除 \(p_j\),则说明 \(S_i\) 不包含这个质因子,进而说明找不到题设要求的 \(x_i\);如果这个 \(S_i\) 能整除 \(p_j\),那么只要求出对应的 \(e_j\),就能算出第 \(j\) 个质因子,要求 \(x_i\) 不小于 \(\lceil \dfrac{\alpha_j m_2}{e_j} \rceil\),再对所有这样的要求取最大值,就得到了 \(x_i\)。最后对所有合法的 \(x_i\) 取最小值就是答案。

参考代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 200;
int cnt[N], cnts[N];
int main()
{
    int n, m1, m2; 
    scanf("%d%d%d", &n, &m1, &m2);
    int m = m1;
    // 对m1分解质因数
    for (int i = 2; i * i <= m; i++) {
        while (m1 % i == 0) {
            cnt[i]++;
            m1 /= i;
        }
    }
    int ans = -1;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < N; j++) cnts[j] = 0;
        int s;
        scanf("%d", &s);
        // 对s分解质因数
        for (int j = 2; j * j <= m; j++) {
            while (s % j == 0) {
                cnts[j]++;
                s /= j;
            }
        }
        bool ok = true;
        int tmp = 0;
        if (m1 > 1) {
            int cntm = 0;
            while (s % m1 == 0) {
                cntm++; s /= m1;
            }
            if (cntm == 0) continue;
            tmp = (m2 + cntm - 1) / cntm;
        }
        for (int j = 2; j * j <= m; j++) {
            if (cnt[j] != 0 && cnts[j] == 0) {
                ok = false; break;
            } 
            if (cnt[j] > 0 && cnts[j] > 0) {
                tmp = max(tmp, (cnt[j] * m2 + cnts[j] - 1) / cnts[j]);
            }
        }
        if (ok && (ans == -1 || tmp < ans)) ans = tmp;
    }
    printf("%d\n", ans);
    return 0;
}

标签:基本,10,le,算术,定理,times,int,cdots,alpha
From: https://www.cnblogs.com/ronchen/p/18441790

相关文章

  • apisix dashboard 基本操作
    apisixdashboard基本操作 安装1、下载rpm包wgethttps://github.com/apache/apisix-dashboard/releases/download/v3.0.1/apisix-dashboard-3.0.1-0.el7.x86_64.rpm2、安装apisix-dashboard-3.0.1-0.el7.x86_64.rpm3、启动systemctlstartapisix-das......
  • 完全零基础 轻松学Python:基本语法元素和函数
    一、基本语法元素01缩进02注释03保留字04变量05数据类型06赋值07函数二、几个常见函数01input()02print()03eval()04type()05id()06dir()07help()-TheEnd -......
  • 基本类型大小,类大小及内存对齐
    讨论类大小时,我们设置系统为64位系统1)空类1字节空类中只包含一个内存地址,保存类对象的唯一地址空类对于一个空类,即使没有任何成员变量,编译器也会为其分配1字节的内存,以确保不同对象的地址唯一性2)包含虚函数的类a)只包含一个/多个虚函数的类8字节每个类的实例只会包含......
  • C++ string的基本运用详细解剖
    string的基本操作一.与C语言中字符串的区别二.标准库中的string三.string中常用接口的介绍1.string中常用的构造函数2.string类对象的容量操作函数3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类的非成员函数6.string中的其他一些操作一.与C语言......
  • 数据结构:基本概念及术语
    一、基本概念        在数据结构中,有这样一些基本概念:数据、数据元素、数据项、数据对象,对于它们的具体含义我就不赘述了,在这就简要说明一下它们之间的关系:    首先,我们可以把数据看成一个大集合,那数据元素就相当于这个集合中的一个个元素,然后一些性质相同的......
  • 学习docker第二弹------基本命令[帮助启动类命令、镜像命令、容器命令]
    docker目录前言基本命令帮助启动类命令停止docker服务查看docker状态启动docker重启docker开机启动docker查看概要信息查看总体帮助文档查看命令帮助文档镜像命令查看所有的镜像-a查看镜像ID-q在仓库里面查找redis拉取镜像查看容器/镜像/数据卷所占内存删除一个镜像删......
  • EasyExcel导出文件基本流程以及原理分析 学习笔记(持续更新)
    EasyExcel导出文件基本流程导出文件基本流程获取数据首先获得需要导出的文件的数据内容,用一个list保存List<SysStudent>list=sysStudentService.queryList(sysStudent);定义文件名给导出的文件定义一个名字,可以添加日期或者根据输入添加其他信息,保证文件名唯一S......
  • 学霸带你游戏化基本数学解谜提升计算能力
    多样化数学操作的探究在数学的学习过程中,绝对值运算、分式化简、根号运算和多项式除法都是基础且重要的内容。这些概念不仅在学术上具有重要性,而且在实际应用中也有着广泛的用途。为了帮助读者更好地理解这些数学操作,我们将通过具体的例子和实际的应用来深入探讨每一个概念。......
  • GaussDB SQL基本语法示例-CASE表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、CASEExpression(CASE表达式)介绍在GaussDBSQL中,CASE表达式(CASEExpression)是一个非常强大......
  • python内置模块typing里Literal函数的基本用法和总结--快速学习掌握Literal函数的用法
    Literal是Pythontyping模块中提供的一种类型注解,用于指定变量或函数的参数只能取特定的字面量值(常量)。它允许你将变量的取值严格限制在指定的一组值内,确保程序只接受特定的常量值,从而减少错误的发生。一、基本概念在Python中,通常我们会使用常见的类型注解来限制变量......