1 条题解

  • 0
    @ 2024-10-27 19:05:10

    题解:

    N=z1z2zm N = z^1 * z^2 *……*z^m

    zi=pieiz_i = {p_i}^{e_i}

    其中 p 为素数,e 为指数,

    将 e 拆分为 k 个数的和,使得 piei{p_i}^{e_i} 不同的个数最多。

    比如:168=23×31×71

    23中的幂次 3=1+2 可以分解 2 次

    31中的幂次 1 可以分解 1 次

    71中的幂次 1 可以分解 1 次

    总的可以分解 2+1+1=4 次

    算法步骤:

    1、从 1N 1 \sim \sqrt[]N枚举能整除 N 的素数 i,并计算 i 能整除 N 几次,求出 i 的指数大小 cnt。

    2、用函数 solve()计算 cnt 能分成的次数 res 比如:

    cnt=3 可以分成 2 次乘积,即 i3 =i1×i2,于是 i 的 res=2。

    3、对枚举的、所有 i 的 res 求和即为答案。

    注意细节:N 被所有符合条件的素数整除后,可能结果不为 1,此时答案 ans++,需要特判一下。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int solve(int e)
    {
       int now=1,res=0;
       while(now<=e)
       {
       	e-=now;
       	now++;
       	res++;
       }
       return res;
    }
    
    int main()
    {
       ll n;
       int ans=0;
       cin>>n;
       ll m=sqrt(n);
    
       for(ll i=2;i<=m;i++)
       {		
       	if(n%i==0)
       	{
       		int cnt=0;
       		while(n%i==0)
       		{
       			n=n/i;
       			cnt++;
       		}
       		ans=ans+solve(cnt);
       	}
       }
       if(n!=1) ans++; 
       cout<<ans<<endl;
       return 0;
    }
    
    

    • 1

    信息

    ID
    222
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    164
    已通过
    17
    上传者