通过这道题学到了2个知识:
1.一个数的质因子一定小于等于这个数的开根
2.一个数的因子(约数)数等于 π(各质因子数+1)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 55555;
//#define DEBUG
int vis[maxn];
int prime[maxn];
int cnt = 0;
void GetPrime(){
memset(vis,0,sizeof(vis));
int m = sqrt(maxn) + 1;
for(int i = 2; i < m; i++)if(!vis[i]){
for(int j = i * i; j < maxn; j += i)
vis[j] = 1;
}
for(int i = 2; i < maxn; i++)
if(!vis[i]) prime[cnt++] = i;
#ifdef DEBUG
for(int i = 0; i < cnt; i++)
printf("%d ",prime[i]);
#endif // DEBUG
}
int solve(int n){
int sum = 1;
for(int i = 0; i < cnt && n > 1; i++){
if(n % prime[i] == 0){
int c = 1;
while(n % prime[i] == 0){
c ++;
n /= prime[i];
}
sum *= c;
}
}
return sum;
}
int main(){
int n,T;
GetPrime();
scanf("%d",&T);
while(T--){
int a,b;
scanf("%d%d",&a,&b);
int temp = 0;
int ret;
for(int i = a; i <= b; i++){
int e = solve(i);
if(temp < e){
temp = e;
ret = i;
}
}
printf("Between %d and %d, %d has a maximum of %d divisors.\n",a,b,ret,temp);
}
return 0;
}