题目背景

对应的选择、判断题:试题 - GESP 202412 C++ 五级 - 洛谷有题

题目描述

小杨认为一个数字 x 是奇妙数字当且仅当 x=pa,其中 p 为任意质数且 a 为正整数。例如,8=23,所以 8 是奇妙的,而 6 不是。

对于一个正整数 n,小杨想要构建一个包含 m 个奇妙数字的集合 {x1​,x2​,⋯,xm​},使其满足以下条件:

  • 集合中不包含相同的数字。
  • x1​×x2​×⋯×xm​ 是 n 的因子(即 x1​,x2​,⋯,xm​ 这 m 个数字的乘积是 n 的因子)。

小杨希望集合包含的奇妙数字尽可能多,请你帮他计算出满足条件的集合最多包含多少个奇妙数字。

输入格式

第一行包含一个正整数 n,含义如题面所示。

输出格式

输出一个正整数,代表满足条件的集合最多包含的奇妙数字个数。

输入输出样例

输入 #1复制

128

输出 #1复制

3

说明/提示

样例解释

关于本样例,符合题意的一个包含 3 个奇妙数字的集合是 {2,4,8}。首先,因为 2=21,4=22,8=23,所以 2,4,8 均为奇妙数字。同时,2×4×8=64 是 128 的的因子。

由于无法找到符合题意且同时包含 4 个奇妙数字的集合,因此本样例的答案为 3。

数据范围

对于 100% 的数据,保证 2≤n≤1012。

子任务编号 得分占比 n
1 20% ≤10
2 20% ≤1000
3 60%

≤1012

代码实现:

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;

ll get_max(ll k)
{
    ll l=1,r=2e6,ans=0;
    while(l<=r)
    {
        ll mid=(l+r)/2;
        ll sum=mid*(mid+1)/2;
        if(sum<=k)
        {
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll n;
    cin>>n;
    ll res=0;
    for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            ll cnt=0;
            while(n%i==0)
            {
                cnt++;
                n/=i;
            }
            res+=get_max(cnt);
        }
    }
    if(n>1) res+=get_max(1);
    cout<<res<<'\n';
    return 0;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐