题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1053
写了个打表程序。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int lst=,cnt,N=2e9,fx=,knt;
int main()
{
for(int i=;i<=N;i+=fx)
{
cnt=;int k=i;
for(int j=;j*j<=k;j++)
{
int ct=;
if(k%j==)
{
if(j!=&&(j&)==){cnt=;break;}
while(k%j==)k/=j,ct++;
}
cnt*=ct+;
}
if(k>)cnt<<=;
if(cnt>lst)printf("%d ",i),lst=cnt,knt++;
if(i==)fx=;
if(i==)fx=;
if(i==)fx=;
}
return ;
}
打了个表过了……
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int c[]={,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,
,,,,,,,,
,,,,,,};
int main()
{
scanf("%d",&n);
for(int i=;i>=;i--)
if(c[i]<=n)
{
printf("%d\n",c[i]);break;
}
return ;
}
然而实际上是dfs。
首先要发现质因数数量一定时越小的质因数应该越多。如果有一个质因数较大而较多,可以把它的数量与一个较小的质因数的数量换一下,这样算出来的约数个数不变,而答案更优。
然后发现2*3*5*7*11*13*17*19*23*29大于2e9。因为上面一行的性质,所以用到的最大的质数是23。
然后就能爆搜了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int n,mx,ans,pri[]={,,,,,,,,};
void dfs(int ps,int cnt,int lst,ll w)
{
if(cnt>mx)mx=cnt,ans=n+;
if(cnt==mx)ans=min(ans,(int)w);
if(ps>)return;//放在这!
for(int i=;i<=lst&&w<=n;i++,w*=pri[ps])//为什么不能从1开始?
dfs(ps+,cnt*(i+),i,w);
}
int main()
{
scanf("%d",&n);
dfs(,,,);
printf("%d\n",ans);
return ;
}