2020牛客寒假算法基础集训营1 E-rin和快速迭代(唯一分解定理)

题目传送
rin最近喜欢上了数论。
然而数论实在太复杂了,她只能研究一些简单的问题。
这天,她在研究正整数因子个数的时候,想到了一个“快速迭代”算法。设f(x)为x的因子个数,将f 迭代下去,rin猜想任意正整数最终都会变成2。
她希望你帮她验证一下。她会给你一个正整数n,让你输出它在迭代过程中,第一次迭代成2的迭代次数。

赛中用暴力做的,竟然也过了?

赛后看题解要用”唯一分解定理“,去恶补了一下。
唯一分解定理:任何一个大于1的正整数均可分解为有限个素数的积,当不考虑因子顺序时,这个分解是唯一的。
n = p1^a1 p2^a2 p3^a3 p4^a4… pk^ak, p1.p2.p3…pk为互不相同的n的因子,a1.a2.a3…ak分别为次数。
性质:n的因子个数 T(n) = (1+a1) * (1+a2) … * (1+ak)

根据这个定理写的代码:

#include <iostream>
using namespace std;

typedef long long ll;

int die(ll x)
{
	int ret = 1;
	for (int i = 2; i * i <= x; i++) {
		int cnt = 0;
		while (x % i == 0) {
			cnt++;
			x /= i;
		}
		ret *= (cnt + 1);
	}
	if (x > 1)ret *= 2;
	return ret;
}

int main(void)
{
	ll n;
	cin >> n;
	int ans = 0;
	while (n != 2) {
		int x = die(n);
		ans++;
		n = x;
	}
	cout << ans;
	return 0;
}
发布了16 篇原创文章 · 获赞 9 · 访问量 4573

猜你喜欢

转载自blog.csdn.net/qq_43054573/article/details/104182867