BZOJ 1053 [HAOI2007]反素数ant

1053: [HAOI2007]反素数ant

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4604  Solved: 2780
[Submit][Status][Discuss]

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

 题解:先固定因数的数量,对于一个数,他的质因子的指数的数量一定不增 (假设出现后面的质因子的数量多于前面的,则可以交换两者的数量而使得这个数变小),这时候我们只要暴力搜索即可;
参考代码:
 1 /**************************************************************
 2     Problem: 1053
 3     User: SongHL
 4     Language: C++
 5     Result: Accepted
 6     Time:20 ms
 7     Memory:1288 kb
 8 ****************************************************************/
 9  
10 #include<bits/stdc++.h>
11 using namespace std;
12 typedef long long ll;
13 ll N,temp,ans;
14 ll Prime[20]={2,3,5,7,11, 13,17,19,23,29, 31,37,41,43,47, 53,59,61,67,71};
15 void dfs(int pos,ll y,int len,ll d)
16 {
17     if(d>temp || d==temp&&ans>y) ans=y,temp=d;
18     if(pos>=20) return ;
19     for(int i=0;i<=len&&y<=N;++i,y*=Prime[pos]) dfs(pos+1,y,i,d*(i+1));
20 }
21  
22 int main()
23 {
24    scanf("%lld",&N);
25    temp=0; dfs(0,1,10000,1);
26     printf("%lld\n",ans);
27     return 0;
28 }
29   
View Code

 

posted @ 2018-10-31 16:21  StarHai  阅读(223)  评论(0编辑  收藏  举报