zoj2562 反素数
/*
这题1 <= n <= 1016,暴力肯定是TLM,所以看了大牛求解小于N的反素数的算法,思路大致是这样的:
性质1:一个反素数的质因子一定是从2开始的若干个连续质数.
因此可以枚举素因子,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47。。最多也就这么几个。
性质2:若有p=2^a1*3^a2*5^a3*......,则必有a1>=a2>=a3>=............an.
另外,如何求p的正约数个数呢,答案就是(a1+1)*(a2+1)*(a3+1)*..........(an=1)
如:p=6=2^1*3^1,故6的约束个数为(1+1)*(1+1)=4 ......等等
然后就是按照素因子递增的顺序逐个搜索,然后枚举每个质因子的个数
*/
1 #include<stdio.h> 2 typedef long long LL; 3 LL N; 4 LL BestSum; 5 LL BestRes; 6 LL prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; 7 8 void work(LL res,LL sum,LL k,LL limit) 9 { 10 if(res>N) 11 return; 12 if(BestSum<sum) 13 { 14 BestSum=sum;BestRes=res; 15 } 16 else if(BestSum==sum&&BestRes>res) 17 BestRes=res; 18 if(k>=16) 19 return; 20 LL p=prime[k]; 21 int i; 22 for(i=1;i<limit;i++,p*=prime[k]) 23 { 24 if(res*p>N) 25 break; 26 work(res*p,sum*(i+1),k+1,i+1); 27 } 28 } 29 30 int main() 31 { 32 while(~scanf("%lld",&N)) 33 { 34 BestSum=1; 35 BestRes=1; 36 work(1,1,0,50); 37 printf("%lld\n",BestRes); 38 } 39 } 40 41
posted on 2013-07-11 15:30 Stomach_ache 阅读(220) 评论(0) 编辑 收藏 举报