BZOJ1053 [HAOI2007] 反素数ant
题目链接: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的最大的反质数。
看这个吧:这是一个百度文库链接
1 #include <cstdio> 2 #define rep(i,l,r) for(int i=l; i<=r; i++) 3 using namespace std; 4 typedef long long ll; 5 const int p[] = {2,3,5,7,11,13,17,19,23,29}; 6 ll n; 7 int ans,num; 8 void dfs(int x,ll now,int cnt,int last){ // 第几个质数,从开始搜索至今质数的乘积,质数个数,质数幂的次数 9 if (x == 9){ 10 if (now > ans && cnt > num) ans = now, num = cnt; 11 if (now <= ans && cnt >= num) ans = now, num = cnt; 12 return; 13 } 14 int t = 1; 15 rep(i,0,last){ 16 dfs(x+1,now*t,cnt*(i+1),i); 17 t *= p[x]; 18 if (now * t > n) break; 19 } 20 } 21 int main(){ 22 scanf("%lld",&n); 23 dfs(0,1,1,10); 24 printf("%d\n",ans); 25 return 0; 26 }