看到这个题,一看U-L <= 10000感觉数据量好小啊,就果断尝试做做。
让你找一个数的正因子个数,感觉应该不是硬来的,就百度了一下,果然有比较简单的方法:
找一个数X的约数个数:
根据唯一分解定理:可以把整数X分解成若干素数相乘的形式:X = (P1^a1 )× (P2^a2 )× (P3^a3 )......
那么X的正因子个数就等于 (a1+1) × (a2+1) × (a3+1)......
所以思路就很清晰了:
1.先从L到H遍历 才1W,
2.然后对遍历的每一个数进行找素数,可以放到map里面,
3.最后遍历map即可!
注意:
遍历素数时,一定是 <= sqrt 而不是 < 因为这错了1次。。
代码如下:
#include<map>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,L,H;
scanf("%d",&n);
while(n--){
scanf("%d%d",&L,&H);
int sum = -1,key;
for (int i = L; i <= H; ++i){
map<int,int>m;
if (i == 1){if (1 > sum){sum = 1;key = i;}continue;}
int temp = 1,ii = i;
for (int k = 2; k <= sqrt(ii); ++k){
if (ii % k == 0){
if (!m.count(k))m[k]=0;
m[k]++;
ii/=k;
k = 1;
}
}
if (ii != 1 && !m.count(ii))m[ii]=0;m[ii]++;
for (map<int,int>::iterator it = m.begin() ;it != m.end(); ++it)temp *= (it->second + 1);
if (temp > sum){sum = temp;key=i;}
}
printf("Between %d and %d, %d has a maximum of %d divisors.\n",L,H,key,sum);
}
return 0;
}