BZOJ 1053 [HAOI2007]反素数ant
1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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,还有那两个奇怪的边界统计。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<stack> 6 #include<queue> 7 #include<cstring> 8 #define PAU putchar(' ') 9 #define ENT putchar('\n') 10 #define LL long long 11 using namespace std; 12 int n,p[12]={1,2,3,5,7,11,13,17,19,23,29,31}; 13 int ans=1,num=1; 14 void dfs(int w,LL now,int cnt,int left){ 15 if(w==11){ 16 if(now>ans&&cnt>num)ans=now,num=cnt; 17 if(now<=ans&&cnt>=num)ans=now,num=cnt; 18 return; 19 }LL t=1; 20 for(int i=0;i<=left;i++){ 21 dfs(w+1,now*t,cnt*(i+1),i);t*=p[w]; 22 if(now*t>n)break; 23 }return; 24 } 25 inline int read(){ 26 int x=0;bool sig=1;char ch=getchar(); 27 for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0; 28 for(;isdigit(ch);ch=getchar())x=10*x+ch-'0'; 29 return sig?x:-x; 30 } 31 inline void write(int x){ 32 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; 33 int len=0,buf[20];while(x)buf[len++]=x%10,x/=10; 34 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; 35 } 36 int main(){ 37 n=read();dfs(1,1,1,30);write(ans);return 0; 38 }