题目传送门
题目大意:
说得很清楚了我就不转述了。
思考过程:
这是一道神坑题,
2∗109
2
∗
10
9
的数据范围,连
O(n)
O
(
n
)
的做法都会超时,也没办法二分答案,感觉根本不可做。(我自己做的时候也没想出来,看了题解才恍然大悟)
首先我们需要了解一个小学奥赛的定理:一个正整数的因数个数,等于所有质因子的指数加一相乘。(证明要用到唯一分解定理)
还有一个显而易见的推论:因数个数相同的,数值越小越优(2*2*5=20优于2*5*5=50)
然后我们开始观察质数乘积的特点,就可以惊讶地发现:
2∗3∗5∗7∗11∗13∗17∗19∗23∗29=6469693230>2∗109
2
∗
3
∗
5
∗
7
∗
11
∗
13
∗
17
∗
19
∗
23
∗
29
=
6469693230
>
2
∗
10
9
,结合上面两条定理,我们就会知道最优解一定只包含前10个质数。10个!只有10个!然后我们就可以通过爆搜完美解决这道题了。
具体做法:
1.打出前十个质数的表
2.爆搜(注意开long long)
代码:
#include <bits/stdc++.h>
using namespace std;
int prime[11]={0,2,3,5,7,11,13,17,19,23,29};
long long n,ans,all;
int s[20];
void dfs(int x,long long sum,long long mul)
{
if(x>10) return;
if(sum>ans||sum==ans&&mul<all)
{
ans=sum;
all=mul;
}
s[x]=0;
while(prime[x]*mul<=n&&s[x]<=s[x-1])
{
s[x]++;
mul*=prime[x];
long long kkk=sum*(s[x]+1);
dfs(x+1,kkk,mul);
}
}
int main()
{
scanf("%lld",&n);
s[0]=1000000;
dfs(1,1,1);
printf("%lld\n",all);
return 0;
}