bzoj 1053
题目其实就是求N范围内约数最多的数中最小的数。
若x=p1^k1*p2^k2……那么约数的个数就是(k1+1)*(k2+1)……的结果。
假如一个数分解质因数之后是一堆质数的一次方,那么我们肯定选素数小的才有可能是反素数。
所以别的素数就不用管了,前面十个素数的乘积就已经大于2*10^9了。
于是就dfs枚举每一个质数的个数即可。
#include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int pri[]={2,3,5,7,11,13,17,19,23,29}; ll n,ans,val; void dfs(int o,ll num,ll y){ if(o==10) return; if(val<y) val=y,ans=num; if(val==y) ans=min(num,ans); for(int i=0;num<=n;num*=pri[o],i+=1) dfs(o+1,num,y*(i+1)); } int main(){ scanf("%lld",&n); dfs(0,1,1); printf("%lld",ans); return 0; }