解析:
反素数,但这里因为是两个long long 相乘,所以一定会爆,所以一定要用double!!!!
可以参考之前的一篇博客
点击打开链接
#include <cstdio>
typedef unsigned long long ull;
const int MAXN = 2e4+10;
const int MAXM = 1e5+10;
int prime[MAXN],cnt;
int check[MAXM];
ull ans,n,anl;
void primetable()
{
for(int i=2;i<MAXM;i++)
{
if(!check[i]) prime[cnt++]=i;
for(int j=i+i;j<MAXM;j+=i)
{
check[j]=1;
}
}
}
void dfs(ull dept,ull num,double x,ull limit) //求[1-n]中的反素数
{
if(dept>=cnt) return;
if(x>n) return;
if(num>ans) ans=num,anl=x;
double tmp=x;
for(ull i=1;i<=limit;i++) //这里不从0开始是因为下一层递推的时候已经*(i+1)且枚举prime[dept]时应该要保证这个数个数>=1
{
if((double )n<(double )prime[dept]*tmp) break;
tmp=(double )prime[dept]*tmp;
dfs(dept+1,num*(i+1),tmp,i);
}
}
int main()
{
int t;
scanf("%d",&t);
primetable();
while(t--)
{
scanf("%llu",&n);
ans=0;
dfs(0,1,1,63); //2^63 = 9e18
printf("%llu\n",ans);
}
return 0;
}