虽然这题很水,但蒟蒻还是想了很久。
首先由一个很显然的结论,这题只会用到10个质数。
一个感性的证明:
设有一数x=pk11+pk22+...+pkmm
那么我们现在要给x乘上一个质数,使它的约数数目最多且相对较小。
显然我们我们要乘第
于是我们看到2∗3∗5∗7∗11∗13∗17∗19∗23∗29=6469693230>2∗109
所以只需要10个质数。
然后想了很久继续用数学方法做,无果,后来发现其实是搜索= =
code:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int prime[11]={0,2,3,5,7,11,13,17,19,23,29};
int mi[11]={0,30,19,13,11,8,8,7,7,6,6};
int n;
long long sum=1,tot=1,ansi=1,ansm=1;
void work(int i)
{
int j;
long long t=prime[i];
if (sum>n) return;
if (tot>ansi||(tot==ansi&&sum<ansm))
{
ansi=tot;
ansm=sum;
}
for (j=1;j<=mi[i];++j)
{
tot=tot*(j+1);
sum=sum*t;
work(i+1);
sum/=t;
tot/=(j+1);
t*=prime[i];
}
}
int main()
{
int i,ans=1,t=1;
scanf("%d",&n);
if (n==1)
printf("1\n");
else
{
work(1);
printf("%lld",ansm);
}
}
本文探讨了一个看似复杂的数学问题,通过巧妙地利用仅十个质数,揭示了解决问题的简洁路径。从直观的证明开始,作者深入阐述了如何通过乘以特定的质数来最大化目标数的约数数量,最终提供了实现这一目标的代码解决方案。
840

被折叠的 条评论
为什么被折叠?



