BZOJ 1053 反素数

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 }
View Code
原文地址:https://www.cnblogs.com/mmlz/p/4285019.html