E-rin和快速迭代
题目描述
rin最近喜欢上了数论。
然而数论实在太复杂了,她只能研究一些简单的问题。
这天,她在研究正整数因子个数的时候,想到了一个“快速迭代”算法。设
f
(
x
)
f
(
x
)
f
(
x
)
f(x)f(x)f(x)
f(x)f(x)f(x) 为
x
x
x
xxx
xxx 的因子个数,将
f
f
f
fff
fff 迭代下去,rin猜想任意正整数最终都会变成
222
222
222 。
例如:
f
(
12
)
=
6
,
f
(
6
)
=
4
,
f
(
4
)
=
3
,
f
(
3
)
=
2
f
(
12
)
=
6
,
f
(
6
)
=
4
,
f
(
4
)
=
3
,
f
(
3
)
=
2
f
(
12
)
=
6
,
f
(
6
)
=
4
,
f
(
4
)
=
3
,
f
(
3
)
=
2
f(12)=6,f(6)=4,f(4)=3,f(3)=2f(12)=6,f(6)=4,f(4)=3,f(3)=2f(12)=6,f(6)=4,f(4)=3,f(3)=2
f(12)=6,f(6)=4,f(4)=3,f(3)=2f(12)=6,f(6)=4,f(4)=3,f(3)=2f(12)=6,f(6)=4,f(4)=3,f(3)=2 。
她希望你帮她验证一下。她会给你一个正整数 ,让你输出它在迭代过程中,第一次迭代成
222
222
222 的迭代次数。
输入描述:
一个正整数
n
n
n
nnn
nnn(
3
≤
n
≤
10123
≤
n
≤
1
0
12
3
≤
n
≤
1012
3≤n≤10123 \le n \le 10^{12}3≤n≤1012
3≤n≤10123≤n≤10123≤n≤1012)
输出描述:
一个正整数,为
n
n
n
nnn
nnn 迭代至
222
222
222 的次数。
思路如下
暴力求解这一题,让我们求某个数的因子,我们就直接求(但是还要稍微优化一下)
题解如下
#include<iostream>
using namespace std;
long long find(long long n)
{
long long i; //注意⚠️这里的i一定要是 long long 否则 i * i 超过int 范围
int cnt = 0;
for(i = 1; i * i < n; i ++)
if(n % i == 0)
cnt += 2;
return cnt + (i * i == n);
}
int main()
{
long long n;
scanf("%lld", &n);
long long int tim = 0;
while(n != 2) n = find(n),tim ++;
printf("%lld", tim);
return 0;
}