题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。
分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。
性质一:一个反素数的质因子必然是从2开始连续的质数。
性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....
LL p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47} ; LL num , fnum , x ; void dfs(LL n , LL fn , int id , LL limit){ if(id == 15) return ; if(fn > fnum){ num = n ; fnum = fn ; } else if(fn == fnum) num = min(num , n) ; LL t = n ; for(LL i = 1 ; i <= limit ; i++){ t *= p[id] ; if(t > x) break ; dfs(t , fn*(i+1) , id+1 , i) ; } } int main(){ while(cin>>x){ num = 1 ; fnum = 1 ; dfs(1 , 1 , 0 , 50) ; cout<<num<<endl ; } return 0 ; }