BZOJ 1053 [HAOI2007]反素数ant
1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4604 Solved: 2780
[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
题解:先固定因数的数量,对于一个数,他的质因子的指数的数量一定不增 (假设出现后面的质因子的数量多于前面的,则可以交换两者的数量而使得这个数变小),这时候我们只要暴力搜索即可;
参考代码:
1 /************************************************************** 2 Problem: 1053 3 User: SongHL 4 Language: C++ 5 Result: Accepted 6 Time:20 ms 7 Memory:1288 kb 8 ****************************************************************/ 9 10 #include<bits/stdc++.h> 11 using namespace std; 12 typedef long long ll; 13 ll N,temp,ans; 14 ll Prime[20]={2,3,5,7,11, 13,17,19,23,29, 31,37,41,43,47, 53,59,61,67,71}; 15 void dfs(int pos,ll y,int len,ll d) 16 { 17 if(d>temp || d==temp&&ans>y) ans=y,temp=d; 18 if(pos>=20) return ; 19 for(int i=0;i<=len&&y<=N;++i,y*=Prime[pos]) dfs(pos+1,y,i,d*(i+1)); 20 } 21 22 int main() 23 { 24 scanf("%lld",&N); 25 temp=0; dfs(0,1,10000,1); 26 printf("%lld\n",ans); 27 return 0; 28 } 29