ZOJ 2562 反素数

本次,学到了反素数相关知识,也更深地了解了DFS递归搜索。

以不同素数来进行分层搜索,指数用来每层可以选择的。

#include<iostream> using namespace std; long long prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43}; long long ans;long long maxmi;long long  n; void dfs(long long x,long long mi,long long  k,long long  limit) {     if(k==15)return;     //k代表层,也代表第K+1个素数     if(x>n)return;            if(mi>maxmi)       //  每次大于则更新     {         maxmi=mi;         ans=x;     }     if(mi==maxmi)     // 相等时时候,取小的     {         if(x<ans)           ans=x;     }     for(int i=1;i<=limit;i++)  // limit是对指数的限制最后2^50次,并用下面的I传递来保证递减性!     {         x*=prime[k];                    if(x>n)return;        //此处不忘跳出。         mi*=(i+1);         dfs(x,mi,k+1,i);         mi=mi/(i+1);          //同层的要变回。     } } int main() {

    while(cin>>n)     {          ans=0;maxmi=0;          dfs(1,1,0,50);          cout<<ans<<endl;     }     return 0; }


 

posted @ 2013-08-19 14:41  天羽屠龙舞  阅读(100)  评论(0编辑  收藏  举报