1. 程式人生 > >BZOJ——T 1053: [HAOI2007]反素數ant

BZOJ——T 1053: [HAOI2007]反素數ant

pri input 一個 fin ext 約數 hint tex lan

http://www.lydsy.com/JudgeOnline/problem.php?id=1053

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

設 x=p1*^k1*p2^k2+p3^k3;則g(x)=(k1+1)*(k2+1)*(k3+1);

又因為2*3*5*7*11*13*17*19*23*26>maxn,

所以可以搜索使用的素數,該素數的次數,以及當前的x

貌似是求使g(x)最大的最小的x,以為我求最大的xWA了、、

 1 #include <cstdio>
 2 
 3 #define LL long long
 4 LL n,ans=1,tmp;
 5 LL ss[10]={1,2,3,5,7,11,13,17,19,23};
 6 
 7
void DFS(LL now,int cnt,int tot) 8 { 9 if(cnt>9) return ; 10 if(tot>tmp) 11 { 12 tmp=tot; 13 ans=now; 14 } 15 if(tot==tmp&&ans>now) ans=now; 16 for(LL i=1; i<=30; ++i) 17 { 18 if(now*ss[cnt]>n) return ; 19 DFS(now*ss[cnt],cnt+1
,tot*(i+1)); 20 now*=ss[cnt]; 21 } 22 } 23 24 int AC() 25 { 26 scanf("%lld",&n); 27 DFS(1,0,1); 28 printf("%lld",ans); 29 return 0; 30 } 31 32 int Aptal=AC(); 33 int main(){;}

BZOJ——T 1053: [HAOI2007]反素數ant