【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 }
1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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