View on GitHub

coderbreakplus.github.io

Prev

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[1010],cnt,prime[1010],tot;
bool isprime(int x){
	for(int i=2;i*i<=x;i++)
		if(x%i==0) return false;
	return true;
}
int mx=9e18;
inline bool qtimes(int a,int b){
	int maxtimes = 920000000000000000ll /b;
	if(a>maxtimes) return false;
	return true; 
}
inline int qpow(int a,int b){
	int ans=1,base=a;
	while(b){
		if(b&1){
			if(!qtimes(ans,base)) return -1;
			ans=ans*base;
		}
		if((!qtimes(base,base))&&(b/2!=0)) return -1;
		base=base*base;
		b>>=1;
	}
	return ans;
}
inline void dfs(int now){
	if(now==1){
		int tmp=1,qwe=1;
		sort(a+1,a+cnt+1);
		for(int i=1;i<=cnt;i++){
			if(!qtimes(qwe,a[i])) return;
			qwe*=a[i];
		}
		if(qwe!=n) return;
//		for(int i=1;i<=cnt;i++) cout<<a[i]<<" "; cout<<endl;
		for(int i=1,j=cnt;i<=cnt;i++,j--){
			int temp=qpow(prime[i],a[j]-1);
		//	cout<<prime[i]<<" "<<a[j]-1<<endl;
			if(temp==-1) return;
			if(!qtimes(tmp,temp)) return;
			tmp*=temp;
		}
		if(tmp<mx) mx=tmp; return;
	}
	for(int i=2;i<=now;i++){
		if(now%i==0){
			a[++cnt]=i;
			dfs(now/i);
			a[cnt--]=0;
		}
	}
}
signed main(){
	scanf("%lld",&n);
	for(int i=2;i<=1e3;i++)
		if(isprime(i)) prime[++tot]=i;
	dfs(n);
	printf("%lld\n",mx);
	return 0;
}