传送门:BZOJ1053
我喜欢数学题,我讨厌结论题……
约数个数定理:
记Φ(p)为p不平凡的约数的个数,对∀q∈N∗,q>1,作Lagrange分解q=∏pa,则Φ(a)=∏(a+1)
对于这道题,我们会注意到a应是随p递减的,且2*3*5*7*11*-…*23*29>2000000000,于是我们只要直接搜索这11个质数在分解式中的指数即可。
代码上的小细节见下。
最近眼睛稍微好受一点点了……
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int prime[11]={1,2,3,5,7,11,13,17,19,23,29};
int n;
int ans,ans_cnt;
long long m;
void Dfs(int where,long long num,int size,int cnt)
{
if(where==11){
if(cnt>ans_cnt&&num>ans)
ans=num,ans_cnt=cnt;
if(ans>=num&&cnt>=ans_cnt)
ans=num,ans_cnt=cnt;
return;
}
int t=1;
for(int i=0;i<=size;i++){
if(num*t>=n)
break;
Dfs(where+1,num*t,i,cnt*(i+1));
t*=prime[where];
}
}
void Readdata()
{
freopen("loli.in","r",stdin);
scanf("%d",&n);
}
void Solve()
{
long long a=1;
Dfs(0,a,30,1);
printf("%d\n",ans);
}
void Close()
{
fclose(stdin);
fclose(stdout);
}
int main()
{
Readdata();
Solve();
Close();
return 0;
}