码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-17 11:05:00      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

搜索


  经典搜索题目(其实是蒟蒻只会搜……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]

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

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4434193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!