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; }