【算法】算数基本定理、分解质因数

【算术基本定理】

算术基本定理⼜称唯⼀分解定理:

• 任何⼀个⼤于 1 的⾃然数 ,都可以唯⼀分解成有限个质数的乘积

n = p1^a1 * p2^a2 * p3^a3 * ... pn^an

• 这⾥ p1、p2、p3、... pn 均为质数,其中指数 ai 是正整数。这样的分解称为 n 的标准分

解式。

【分解质因数】

• 分解质因数就是将⼀个合数⽤质因数相乘的形式表⽰出来,例如 360 = 2^3 * 3^2 * 5

试除法分解质因数

• n 的所有因数中,不会有两个⼤于根号 n 。

因此,枚举 [2,根号n] 中所有的数(必须从小到大枚举),如果能整除 n 就⼀直除下去。如果最后剩下的数⼤于 1,那就是⼤于根号 n 的因⼦。小优化:可以只枚举 [2,根号n] 中所有的素数,但那样优化不大。

cpp 复制代码
int c[N]; // c[i] 表⽰ i 这个质数出现的次数
// 比如 600 :c[2] == 3、c[3] == 1、c[5] == 2

void deprime(int x)
{
	for (int i = 2; i <= x / i; i++) // 注意防溢出
	{
		int cnt = 0;
		while (x % i == 0) // 只要有这个因⼦,就除尽,并且计数
		{
			x /= i;
			cnt++;
		}
		c[i] += cnt;
	}
	if (x > 1) c[x]++; // 不要忘记判断最后⼀个质数
}

时间复杂度:

枚举到根号n ,因此时间复杂度为 O(根号N) 。但是最优情况下会达到 O(log n),比如分解 16,会一直除 2,除 log16 次

阶乘分解

对 n!进行质因子分解。可以先算出 n!,但如果 n 是 10000,结果会溢出。采用对 2、3、4、...、n 分别进行质因子分解,把所有结果累计到 cnt 数组。

P2043 质因子分解 - 洛谷

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 1e4 + 10;
int n,cnt[N];
void deprime(int x)
{
	for (int i = 2; i <= x / i; i++)
	{
		int c = 0;
		while (x % i == 0)
		{
			x /= i;
			c++;
		}
		cnt[i] += c;
	}

	if (x > 1) cnt[x]++;
}
int main()
{
	cin >> n;
	for (int i = 2; i <= n; i++) deprime(i);
	for (int i = 2; i <= n; i++)
	{
		if (cnt[i]) cout << i << ' ' << cnt[i] << endl;
	}
	return 0;
}

还可以采用统计 2*3*4*...*n 中,质数2、3、5、7、... m (m <=n) 分别一共出现了多少次(这里的质数需要自己筛),

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int p[N],n,cnt;
bool st[N];
void get_prime()
{
	for (long long i = 2; i <= n ; i++)
	{
		if (!st[i]) p[cnt++] = i;

		for (int j = 0; i * p[j] <= n; j++)
		{
			st[i * p[j]] = true;
			if (i % p[j] == 0) break;
		}
	}
}

int main()
{
	cin >> n;

	get_prime();

	for (int i = 0; i < cnt; i++)
	{
		int s = 0;
		for (long long j = p[i]; n / j != 0; j *= p[i])
		{
			s += n / j;
		}
		if (s) cout << p[i] << ' ' << s << endl;
	}

	return 0;
}
相关推荐
yong99909 分钟前
基于灰狼算法优化支持向量回归(GWO-SVR)的混合算法
算法·数据挖掘·回归
sali-tec11 分钟前
C# 基于OpenCv的视觉工作流-章53-QR二维码1
图像处理·人工智能·opencv·算法·计算机视觉
ECT-OS-JiuHuaShan14 分钟前
功夫不负匠心人,渡劫代谢舞沧桑
android·开发语言·人工智能·算法·机器学习·kotlin·拓扑学
智者知已应修善业22 分钟前
【51单片机ADC-MAX1241/ADC0832驱动】2023-6-6
c++·经验分享·笔记·算法·51单片机
re林檎28 分钟前
算法札记——4.26
算法
tankeven42 分钟前
动态规划专题(10):最优三角剖分问题
c++·算法·动态规划
黑眼圈子1 小时前
动态规划问题专项练习(未编辑完成...
学习·算法·动态规划
探物 AI1 小时前
【感知·车道线检测】UFLDv2车道线检测与车道偏离预警(LDWS)实战
人工智能·算法·目标检测·计算机视觉
菜鸟丁小真1 小时前
LeetCode hot100 -54.螺旋矩阵
算法·leetcode·矩阵·知识点总结
weixin_468466851 小时前
排列组合算法之隔板问题与错排公式
c++·算法·数学建模·排列组合·竞赛·错排·隔板