2020牛客寒假算法基础集训营1——E.rin和快速迭代【数论 & 模拟】

题目传送门


题目描述

”数论真的太好玩了喵~“——hoshizora rin
rin最近喜欢上了数论。
然而数论实在太复杂了,她只能研究一些简单的问题。
这天,她在研究正整数因子个数的时候,想到了一个“快速迭代”算法。设 f ( x ) f(x) x x 的因子个数,将 f f 迭代下去,rin猜想任意正整数最终都会变成 2 2
例如:在这里插入图片描述
她希望你帮她验证一下。她会给你一个正整数 n n ,让你输出它在迭代过程中,第一次迭代成 2 2 的迭代次数。


输入描述:

一个正整数


输出描述:

一个正整数,为 迭代至 的次数。


输入

12


输出

4


说明

12的因子:1,2,3,4,6,12。共6个。
6的因子:1,2,3,6。共4个。
4的因子:1,2,4。共3个。
3的因子:1,3。共2个。
12 → 6 → 4 → 3 → 2 , 故迭代了4次。


题解

  • 只要会 O ( n ) O(\sqrt{n}) 复杂度处理每一次迭代就行。是一道披着假数论的 i m p l e m e n t a t i o n implementation
  • c f 1000 参考cf难度分:1000

AC-Code

#include <bits/stdc++.h>
using namespace std;
#define  ll long long

ll num(ll n) { //返回的是因子总数
    ll count = 2;
    for (ll i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            if (i == sqrt(n) && n / i == i) //如果两因子相同,则只加1
                count++;
            else
                count += 2;
        }
    }
    return count;
}

int main(){
    ll n;
    while(cin >> n){
        ll cnt = 0;
        while(n > 2 || cnt == 0){
            n = num(n);
            ++cnt;
        }
        cout << cnt << endl;
    }
}
发布了157 篇原创文章 · 获赞 99 · 访问量 9825

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104174603