反素数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5194    Accepted Submission(s): 3043



Problem Description


反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。


 


 


Input


第一行输入n,接下来n行测试数据 输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].


 


 


Output


输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.


 


 


Sample Input



32 3 1 10 47 359


 


 


Sample Output



2 6 240


Hint

2的因子为:1 2 10的因子为:1 2 5 10

 


题解:反素数模版没搞出来,暴力倒是立马ac。。。

代码:



#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
typedef unsigned long long uLL;
const uLL INF=(uLL)~0;
const double PI=acos(-1.0);
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define T_T while(T--)
#define P_ printf(" ")
int prim[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
uLL ans,a,b;
int nm,flot;
/*void dfs(int pos,uLL v,int num){
if(num==nm&&ans>v)ans=v;
if(v>=a&&v<=b&&num>nm)ans=v,nm=num,flot=1;
for(int i=1;i<=63;i++){
if(v*prim[pos]>b)break;
dfs(pos+1,v*=prim[pos],num*(i+1));
}
}*/
int js(int temp){
int num=1;
for(int i=2;i<temp;i++){
int x=0;
if(temp%i==0){
while(temp%i==0)x++,temp/=i;
num*=(x+1);
}
}
if(temp>1)num*=2;
return num;
}
int main(){
int T;
SI(T);
T_T{
scanf("%llu%llu",&a,&b);
int nm=0;
for(int i=a;i<=b;i++){
int temp=js(i);
if(temp>nm)nm=temp,ans=i;
}
printf("%llu\n",ans);
}
return 0;
}