1053: [HAOI2007]反素数ant

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
 
约数个数定理。。。然后dfs一下。。。当我们把前11个质数乘起来就发现够了。。所以只需要对着十二个质数dfs就好了。。。
 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<algorithm>
 7 #include<string>
 8 #include<map>
 9 #include<queue>
10 #include<vector>
11 #include<set>
12 #define inf 1000000000
13 #define maxn 10000+5
14 #define maxm 10000+5
15 #define eps 1e-10
16 #define ll long long
17 #define for0(i,n) for(int i=0;i<=(n);i++)
18 #define for1(i,n) for(int i=1;i<=(n);i++)
19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22 using namespace std;
23 int read(){
24     int x=0,f=1;char ch=getchar();
25     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
26     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
27     return x*f;
28 }
29 int p[15]={1,2,3,5,7,11,13,17,19,23,29,31};
30 int n;
31 ll ans,num;
32 void dfs(int k,ll now,ll cnt,int last){
33     if(k==12){
34         if(now>ans&&cnt>num){ans=now;num=cnt;return;}
35         if(now<=ans&&cnt>=num){ans=now;num=cnt;return;}
36         return;
37     }
38     ll t=1;
39     for0(i,last){
40         dfs(k+1,now*t,cnt*(last+1),i);
41         t*=p[k];
42         if(now*t>n)return;
43     }
44 }
45 int main(){
46     //freopen("input.txt","r",stdin);
47     //freopen("output.txt","w",stdout);
48     n=read();
49     dfs(1,1,1,20);
50     printf("%lld",ans);
51     return 0;
52 }
View Code

 

posted @ 2016-05-22 20:38  HTWX  阅读(92)  评论(0编辑  收藏  举报