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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值