Description

先解释一下SAPGAP=Super AntiPrime, Greatest AntiPrime(真不是网络流),于是你就应该知道本题是一个关于反质数(Antiprime)的问题。下面给出反质数的定义:
将一个正整数i的约数个数记为g(i),如g(1)=1,g(2)=2,g(6)=4。
如果对于一个正整数k,对于任意正整数i<k,均有g(k)>g(i),则k被称为反质数。
比如说1,2,4,6,12就是前5个反质数。
现在给定一个N,求N以内最大的反质数。
你一定会认为这道题很简单,你曾经做过好多遍(它就是许许多多竞赛的原题呀),但是这次真的不一样。
 

Input

一个正整数N(1≤N≤10)。
 

Output

一个正整数,表示不超过N的最大的反质数。
 

Sample Input

1000

Sample Output

840
 
 
套个高精度模板,然后搜个索,剪个枝就好了……
 bzoj:3085: 反质数加强版SAPGAP-LMLPHP
bzoj:3085: 反质数加强版SAPGAP-LMLPHP
壮哉我大云神……
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std; const int bi=1e4,MN=;
char c[];
int pr[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
struct big{
int a[MN];
inline big(){
memset(a,,sizeof(a));
a[]=;
}
inline void read(){
register int i,j;
scanf("%s",c);
a[]=(strlen(c)+)/;
for (i=;i<strlen(c);i++) j=(strlen(c)-i+)/,a[j]=a[j]*+c[i]-;
}
inline void pr(){
register int i;
printf("%d",a[a[]]);
for (i=a[]-;i;i--) printf("%04d",a[i]);
}
inline big operator =(int x){
if (x==){
memset(a,,sizeof(a));
a[]=;
}
a[]=;
while (x){
a[]++;
a[a[]]=x%bi;
x/=bi;
}
if (!a[]) a[]=;
}
inline big(int x){
*this=x;
}
inline void gl(){
while(!a[a[]]&&a[]>) a[]--;
}
inline big operator =(big x){
register int i;
a[]=x.a[];
for (i=;i<=a[];i++) a[i]=x.a[i];
}
inline bool operator >(big y){
if (a[]!=y.a[]) return a[]>y.a[];
for (register int i=a[];i;i--){
if (a[i]!=y.a[i]) return a[i]>y.a[i];
}
return ;
}
inline bool operator >=(const big y){
if (a[]!=y.a[]) return a[]>y.a[];
for (register int i=a[];i;i--){
if (a[i]!=y.a[i]) return a[i]>y.a[i];
}
return ;
}
inline bool operator <(big y){
if (a[]!=y.a[]) return a[]<y.a[];
for (register int i=a[];i;i--){
if (a[i]!=y.a[i]) return a[i]<y.a[i];
}
return ;
}
inline bool operator <=(big y){
if (a[]!=y.a[]) return a[]<y.a[];
for (register int i=a[];i;i--){
if (a[i]!=y.a[i]) return a[i]<y.a[i];
}
return ;
}
inline bool operator ==(big y){
if (a[]!=y.a[]) return ;
for (register int i=a[];i;i--){
if (a[i]!=y.a[i]) return ;
}
return ;
}
inline bool operator !=(big y){
return !(*this==y);
}
inline bool operator ==(int y){
big x=y;
return *this==x;
}
inline bool operator !=(int y){
return !(*this==y);
}
inline void swap(big &a,big &b){
big x=a;a=b;b=x;
}
inline big operator +(big x){
big r;
if (a[]<x.a[]) r.a[]=x.a[];else r.a[]=a[];
for (register int i=;i<=r.a[];i++) r.a[i]=a[i]+x.a[i];
for (register int i=;i<=r.a[];i++)
if (r.a[i]>=bi){
r.a[i]-=bi;r.a[i+]++;
if (i==r.a[]) r.a[]++;
}
return r;
}
inline big operator -(big x){
if (*this<x) swap(*this,x);
register int i;
big r;
if (a[]<x.a[]) r.a[]=x.a[];else r.a[]=a[];
for (i=;i<=r.a[];i++) r.a[i]=a[i]-x.a[i];
for (i=;i<=r.a[];i++)
if (r.a[i]<){
r.a[i+]--;r.a[i]+=bi;
}
r.gl();
return r;
}
inline big operator *(big y){
register int i,j;
big r;r.a[]=a[]+y.a[]-;
for (i=;i<=a[];i++)
for (j=;j<=y.a[];j++) r.a[i+j-]+=a[i]*y.a[j];
for (i=;i<=r.a[];i++)
if (r.a[i]>=bi){
r.a[i+]+=r.a[i]/bi;
r.a[i]%=bi;
if (i==r.a[]) r.a[]++;
}
return r;
}
inline big half(){
register int i,j;
for (i=a[];i>;i--) a[i-]+=(a[i]%)*bi,a[i]/=;
a[]/=;
gl();
return *this;
}
inline big operator /(big y){
register int i,j;
big r,l,mid,rq=*this;
r.a[]=rq.a[]+;r.a[r.a[]]=;
while(r>l){
mid=(l+r+big()).half();
if (mid*y<=rq) l=mid;else r=mid-big();
}
return l;
}
inline big operator %(big y){
register int i,j;
big rq=*this;
return rq-(rq/y*y);
}
}n,ans;
long long cu;
void dfs(int pos,int p,big sum,long long su){
if (pos==&&p>) p=;else
if (pos==&&p>) p=;else
if (pos==&&p>) p=;else
if (pos==&&p>) p=;else
if (pos==&&p>) p=;
if (pos>||sum>n) return;
if ((su>cu)||(sum<ans&&cu==su)) cu=su,ans=sum;
for (register int i=;i<=p;i++){
sum=sum*big(pr[pos]);
if (sum>n) return;
dfs(pos+,i,sum,su*(i+));
}
}
int main(){
n.read();
dfs(,,big(),);
ans.pr();
}
04-23 06:32