【HAOI 2007】【BZOJ 1053】反素数ant

来源:互联网 发布:不见不散 知乎 编辑:程序博客网 时间:2024/05/14 10:36

虽然这题很水,但蒟蒻还是想了很久。
首先由一个很显然的结论,这题只会用到10个质数。

一个感性的证明:
设有一数x=pk11+pk22+...+pkmm
那么我们现在要给x乘上一个质数,使它的约数数目最多且相对较小。
显然我们我们要乘第1im+1个质数,如果乘再靠后的质数,显然不如乘第m+1个更优。
于是我们看到2357111317192329=6469693230>2109
所以只需要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);      } }
0 0