zoj 2562 反素数
题意:给一个N,求不超过N的哪个数的因子数最多,数目相同的取值小的那个。
分析:反素数定义:g(i)表示 i 含有因子的数目,若小于x的任意数 i,都有 g(i)<g(x), 则x是一个反素数。
反素数特性: x = 2^t1 * 3^t2 * 5^t3 * 7^t4 .....
这里有 t1>=t2>=t3>=t4... t1>0 t2>0 t3>0...
证明:如果ti<tj,其中i<j,由于pi小于pj,那么pi^tj*pj^ti<pi^ti*pj^tj,这样就出现了因子数目相同,但x更小的情况,与反素数的定义矛盾。
然后搜索。。
int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; long long lim; long long n,c; void dfs(int i,int Max,long long num,long long cnt){//第i个素数 可选Max个 当前积 当前因子数 if(c==cnt)checkmin(n,num); else if(c<cnt){c=cnt;n=num;} if(i>14) return; FOE(j,1,Max){ num*=p[i]; if(num>lim) return; dfs(i+1,j,num,cnt*(j+1)); } } int main(){ while(cin>>lim){ n=lim; c=1; dfs(0,50,1,1); cout<<n<<endl; } return 0; }