【bzoj1053】[HAOI2007]反素数ant

对于任何正整数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
 

本题似乎要先知道许多结论,不要问我证明。。

一个数约数个数=所有素因子的次数+1的乘积
举个例子就是48 = 2 ^ 4 * 3 ^ 1,所以它有(4 + 1) * (1 + 1) = 10个约数

然后可以通过计算得一个2000000000以内的数字不会有超过12个素因子

并且小素因子多一定比大素因子多要优

预处理出前12个素数直接爆搜即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 
 7 #define inf 0x7fffffff
 8 #define ll long long 
 9 using namespace std;
10 
11 int n,ans=1,num=1;
12 int p[15]={0,2,3,5,7,11,13,17,19,23,29,31};
13 
14 void dfs(int k,ll now,int cnt,int last)
15 {
16     if(k==12)
17     {
18         if(now>ans&&cnt>num){ans=now;num=cnt;}
19         if(now<=ans&&cnt>=num){ans=now;num=cnt;}
20         return;
21     }
22     int t=1;
23     for(int i=0;i<=last;i++)
24     {
25         dfs(k+1,now*t,cnt*(i+1),i);
26         t*=p[k];
27         if(now*t>n)break;
28     }
29 }
30 int main()
31 {
32     scanf("%d",&n);
33     dfs(1,1,1,20);
34     printf("%d",ans);
35 }

 

posted @ 2017-09-26 21:18  Kaiser-  阅读(163)  评论(0编辑  收藏  举报