Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
Sample Input
1000
Sample Output
840
HINT
Source
开始没有想清楚这个问题的本质,半小时后才发现这TM不就是要求1-n中约数最多的最小数。(自己稍微yy一下应该就可以了。)
然后我们就要求1-n中约数最多的最小数。这个我们采用暴搜的方法,枚举每个质数的质数,推过去即可。
开始我的质数范围是1-√n,果断TLE。其实只要用前12个质数就可以了,因为质数大了反而没有小质数对答案的贡献那么大。
1 #include<cmath> 2 #include<cstdio> 3 #include<cstdlib> 4 using namespace std; 5 6 typedef long long ll; 7 int best,most,n,tot = 12; 8 int prime[15] = {0,2,3,5,7,11,13,17,19,23,29,31,37}; 9 10 inline void dfs(ll now,ll num,int last) 11 { 12 if (num > most) most = num,best = now; 13 else if (num == most && now < best) best = now; 14 for (int i = last;i <= tot;++i) 15 { 16 ll key = 1; 17 for (int j = 1;;++j) 18 { 19 key *= (ll)prime[i]; 20 if (now*key > n) break; 21 dfs(now*key,num*(j+1),i+1); 22 } 23 } 24 } 25 26 int main() 27 { 28 freopen("1053.in","r",stdin); 29 freopen("1053.out","w",stdout); 30 scanf("%d",&n); 31 dfs(1,1,1); printf("%d",best); 32 fclose(stdin); fclose(stdout); 33 return 0; 34 }