【BZOJ】【1053】【HAOI2007】反素数ant

搜索


  经典搜索题目(其实是蒟蒻只会搜……vfleaking好像有更优秀的做法?)

  枚举质数的幂,其实深度没多大……因为$2^32$就超过N了……而且质数不能取的太大,所以不会爆……

 1 /**************************************************************
 2     Problem: 1053
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:40 ms
 7     Memory:1760 kb
 8 ****************************************************************/
 9  
10 //BZOJ 1053
11 #include<cmath>
12 #include<vector>
13 #include<cstdio>
14 #include<cstring>
15 #include<cstdlib>
16 #include<iostream>
17 #include<algorithm>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 #define pb push_back
22 using namespace std;
23 inline int getint(){
24     int v=0,sign=1; char ch=getchar();
25     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
26     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
27     return v*sign;
28 }
29 const int N=2e9,INF=~0u>>2;
30 typedef long long LL;
31 /******************tamplate*********************/
32 int n,prime[100010],tot;
33 LL mx=0,ans=0;
34 bool vis[100010];
35 //第x个质数,总乘积为now,因数个数为m
36 void dfs(int x,LL now,LL m,int lim){
37     if (m>mx && now<=n){
38         mx=m; ans=now;
39     }
40     if (m==mx && now<ans && now<=n) ans=now;
41     if (x>100) return;
42     LL p=now;
43     F(i,1,lim){
44         if (p*prime[x]>n) break;
45         p*=prime[x];
46         dfs(x+1,p,m*(i+1),lim-i);
47     }
48 }
49 int main(){
50 #ifndef ONLINE_JUDGE
51     freopen("1053.in","r",stdin);
52     freopen("1053.out","w",stdout);
53 #endif
54     scanf("%d",&n);
55     F(i,2,sqrt(N)){
56         if (!vis[i]){
57             prime[++tot]=i;
58             for(int j=i*i;j<=sqrt(N);j+=i) vis[j]=1;
59         }
60     }
61     dfs(1,1,1,20);
62     printf("%lld\n",ans);
63     return 0;
64 }
View Code

1053: [HAOI2007]反素数ant

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1821  Solved: 1014
[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

Source

[Submit][Status][Discuss]
posted @ 2015-04-17 10:39  Tunix  阅读(198)  评论(0编辑  收藏  举报