这道题刚开始的想法有点乱,后来发现死路时看了解题报告提到了反素数+搜索,查了一下反素数的资料(话说以前也看过,但没有理解,这次彻底搞懂)。。。然后用搜素切掉,话说搜素还是不行呀,长时间不练,出道时最拿手的已经生疏了太多。。。哎。。。。。
反素数的概念:设一个数x的约数时k,g(x)=k,满足g(x1)<k,x1是所有小于x的正整数
反素数一定是2^t1*3^t2*5^t3.....(其中t1>=t2>=t2>=....)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#ifdef _WIN32
#define ll __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define ll long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif
#define pb push_back
#define N 50
using namespace std;
#define ss(a) scanf(in64,&a)
int a[N];
vector<ll>b;
ll mmax,n,mi;
void prime()
{
int i,j;
for (i=2;i<N;i++)
if (!a[i])
{
b.pb(i);
for (j=2*i;j<N;j+=i) a[j]=1;
}
}
void build(ll res,ll val,ll j,ll t,ll t1)
{
ll i,x,x1;
x=b[j];
x1=b[j+1];
cout<<res<<" "<<val<<endl;
if (val>mmax)
{
mmax=val;
mi=res;
}
else if (val==mmax&&res<mi) mi=res;
if (x*res<=n&&t<t1)
{
ll nv=val/(t+1)*(t+2);
build(res*x,nv,j,t+1,t1);
}
if (res*x1<=n) build(res*x1,val*2,j+1,1,t);
}
int main()
{
prime();
while (ss(n)!=EOF)
{
mmax=-1;
mi=-1;
build(2,2,0,1,60);
printf(out64,mi);
}
return 0;
}