《B4070 [GESP202412 五级] 奇妙数字》
·
题目背景
对应的选择、判断题:试题 - 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;
}
更多推荐

所有评论(0)