zoj2562 More Divisors
来源:互联网 发布:vue.js 入门教程 编辑:程序博客网 时间:2024/05/22 02:19
#include<iostream>#include<vector>#include<algorithm>#include<cstdio>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<cmath>#include<cassert>#include<cstring>#include<iomanip>using namespace std;typedef long long i64;#define out64 "%lld\n"#define in64 "%lld"/************ for topcoder by zz1215 *******************/#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)#define FFF(i,a) for( int i = 0 ; i < (a) ; i ++)#define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --)#define S64(a) scanf(in64,&a)#define SS(a) scanf("%d",&a)#define LL(a) ((a)<<1)#define RR(a) (((a)<<1)+1)#define pb push_back#define CL(Q) while(!Q.empty())Q.pop()#define MM(name,what) memset(name,what,sizeof(name))#define read freopen("in.txt","r",stdin)#define write freopen("out.txt","w",stdout)const int inf = 0x3f3f3f3f;const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;const double oo = 10e9;const double eps = 10e-9;const double pi = acos(-1.0);const i64 maxn = 10000000000000000LL;struct zz{ i64 x; i64 n; bool operator < (const zz & cmp ) const { return x < cmp.x; }}zx;vector<i64>p;vector<zz>vx;vector<i64>v;bool isp(i64 x){ i64 temp = sqrt(x); for(int i=0;i<p.size();i++) { if(p[i]>temp) return true; if(!(x%p[i])) return false; } return true;}void init(){ p.clear(); p.pb(2); for(int i=3;i<100;i++) { if(isp(i)) { p.pb(i); } } return ;}void dfs(i64 rest,i64 id=0,i64 pre=inf,i64 x=1,i64 n=1){ if(id>16) return ; if(rest == 0) { zx.x = x; zx.n = n; vx.pb(zx); return ; } i64 temp; bool ok; for(int i=min(pre,rest);i>=1;i--) { temp = x; ok = true; for(int u=1;u<=i;u++) { temp *= p[id]; if(temp > maxn) { ok = false; break; } } if(!ok) continue; dfs(rest-i,id+1,i,temp,n*(i+1)); } return ;}void start(){ for(int i=0;i<30;i++) { dfs(i); } sort(vx.begin(),vx.end()); i64 temp = 0; v.clear(); for(int i=0;i<vx.size();i++) { if(vx[i].n <= temp) { continue; } else { temp = vx[i].n; v.pb(vx[i].x); } } v.pb(inf64); return ;}i64 n;i64 find(){ int l = 0; int r = v.size()-1; int mid; while(l<r) { mid = (l+r+1)/2; if(v[mid] < n) { l = mid; } else if(v[mid]>n) { r = mid-1; } else { return v[mid]; } } return v[l];}int main(){ init(); start(); while(cin>>n) { cout<<find()<<endl; } return 0;}