题目描述

在遥远的米♂奇♂妙♂妙♂屋里住着一群自然数,他们没事就喜欢拆♂开自己来探♂究。现在他们想知道自己最多能被拆分成多少个不同的自然数,使得这些自然数相乘的值等于被拆分的数。

输入描述

第1行输入一个整数T,代表有T组数据。
第2-T+1行,每行输入一个整数n,代表需要被拆分的数。
数据保证:0<T≤100,0<n≤109。

输出描述

输出一共T行,第i行输出一个整数,代表第i行输入的n最多可以被拆分成多少个不同的自然数。

题目思路

本题带有一点贪心的思想。
即从最小的数开始,对小于等于n的数进行遍历;同时不断改变n的值,即

for(int i = 2; i <= n ;i++)
{
    if(n % i == 0 && i * i != n)//注意,由于不能出现相同因数,故需要判断i * i != n
    {
        cont++;
        n /= i;
    }
}

完整代码

#include<stdio.h>
#include<string>
#define ll long long
using namespace std;
ll n;
int t;
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%lld",&n);
        ll temp = n;
        ll cont = 1;
        for(int i = 2; i <= n ;i++)
        {
            if(n % i == 0 && i * i != n)
            {
                cont++;
                n /= i;
            }
        }
        if(cont == 1 && temp != 1) cont++;    
        printf("%d\n", cont);
    }
}

总结

刚开始看这道题时,一见到求最大值就直奔动态规划,发现复杂度高(O(N^2))。因此这种和因数相关的题目还是直接遍历,通过改变上界求解比较容易。动归可以在求加数时使用。