分解质因数


质因数分解

首先引入定理:
对于任何一个大于1的正正整数都可以分解为有限个质数的的乘积,可记作:

\(N = p_{1}^{C1} p_{2}^{C2}...p_{m}^{Cm}\)

其中Ci都是正整数,pi都是质数,且满足

\(p_1 < p_2 < ... < p_m\)

一般在做题时,采用试除法和埃氏筛基本就足够了。大致可描述为,扫描区间\([2, \sqrt{N}]\)的每个数d,如果d可以整处N(N % d == 0),那么说明d是一个质数,并且去掉N中的d一次。

需要注意的是,一个合数的的因子在扫描到这个合数之前就从N中被去掉了,所以在上述过程中能整除N的一定是质数。

特别地,如果N没有被任何\([2, \sqrt{N}]\)所整除,说明N本身就是一个质数,无需进行分解。

int p[MAX], C[MAX];
void divide(int N)
{
    int m = 0;
    //在[1, sqrt(N)]区间内试除;
    for (int i = 2; i  * i <= N; i++) {
        if (N % i == 0) {
            p[++m] = i, c[m] = 0;
            while (N % i == 0) {
                N = N / i;
                c[m]++;
            }
        }
    }

//N本身就是质数;
     if (N > 1) {
         p[++m] = N, c[m] = 1;
     }
}

例题:[lc650]

  1. 只有两个键的键盘

最初记事本上只有一个字符 'A' 。你每次可以对这个记事本进行两种操作:

Copy All(复制全部):复制这个记事本中的所有字符(不允许仅复制部分字符)。
Paste(粘贴):粘贴 上一次 复制的字符。

给你一个数字 n ,你需要使用最少的操作次数,在记事本上输出 恰好 n 个 'A' 。返回能够打印出 n 个 'A' 的最少操作次数。
示例 1:

输入:3
输出:3
解释:
最初, 只有一个字符 'A'。
第 1 步, 使用 Copy All 操作。
第 2 步, 使用 Paste 操作来获得 'AA'。
第 3 步, 使用 Paste 操作来获得 'AAA'。

示例 2:

输入:n = 1
输出:0

提示:

1 <= n <= 1000
//解析:本质上就是分解质因数,然后对质因数进行累加;
//如此,可以对照模板来写;
   int minSteps(int n) {
        int ans = 0;
        for (int i = 2; i * i <= n; i++) {
            while (n % i == 0) {
                ans += i;
                n /= i; 
            }
        }

        if (n > 1) ans += n;

        return ans;
    }

参考

1.算法竞赛进阶指南


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM