题目链接:L. Clock Master.
题意:将n分成几个数使其lcm最大,输出ln(lcm)。
思路:预处理素数及ln值,然后每个素数及其次幂为一组,转换为分组背包问题。注意:log运算可将乘法转换为加法,将幂转换为系数。
int t,n;
int pri[30010],vis[30010],tot;
double dp[30010],ln[30010];
void solve()
{
vis[0]=1,vis[1]=1,tot=0;
for(int i=2;i<=30000;i++)
{
if(!vis[i])
{
pri[tot++]=i;
//printf("%d ",i);
for(int j=i+i;j<=30000;j+=i)vis[j]=1;
}
}
printf("\n");
for(int i=1;i<=30000;i++)ln[i]=log(i);
for(int i=0;i<tot;i++)
{
for(int j=30000;j>=pri[i];j--)
{
for(int k=pri[i];k<=j;k=k*pri[i])
{
dp[j]=max(dp[j],dp[j-k]+ln[k]);
}
}
}
}
int main()
{
//ios::sync_with_stdio(0);
//cin.tie(0);cout.tie(0);
solve();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%.9f\n",dp[n]);
}
return 0;
}