分解质因数
质因数分解
首先引入定理:
对于任何一个大于1的正正整数都可以分解为有限个质数的的乘积,可记作:
其中Ci都是正整数,pi都是质数,且满足
一般在做题时,采用试除法和埃氏筛基本就足够了。大致可描述为,扫描区间的每个数d,如果d可以整处N(N % d == 0),那么说明d是一个质数,并且去掉N中的d一次。
需要注意的是,一个合数的的因子在扫描到这个合数之前就从N中被去掉了,所以在上述过程中能整除N的一定是质数。
特别地,如果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]
- 只有两个键的键盘
最初记事本上只有一个字符 '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.算法竞赛进阶指南
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效