BZOJ 1053 [HAOI2007]反素数ant

时间:2021-11-22 07:01:16

1053: [HAOI2007]反素数ant

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

题解:要知道一个数约数个数=所有素因子的次数+1的乘积,然后爆搜就可以了,注意小素因子多一定比大素因子多要优,所以加一个left,还有那两个奇怪的边界统计。。。

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define LL long long
using namespace std;
int n,p[]={,,,,,,,,,,,};
int ans=,num=;
void dfs(int w,LL now,int cnt,int left){
if(w==){
if(now>ans&&cnt>num)ans=now,num=cnt;
if(now<=ans&&cnt>=num)ans=now,num=cnt;
return;
}LL t=;
for(int i=;i<=left;i++){
dfs(w+,now*t,cnt*(i+),i);t*=p[w];
if(now*t>n)break;
}return;
}
inline int read(){
int x=;bool sig=;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int main(){
n=read();dfs(,,,);write(ans);return ;
}