题目传送
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;
}