1.题目描述:点击打开链接
2.解题思路:本题利用暴力搜索解决。因为题目中R-L最大不超过10000,可以直接进行搜索。并用ans,p分别标记目前找到的约数最多的个数以及对应的整数。因此关键问题是如何快速计算一个整数n的正约数的个数。
方法是这样的:可以从2开始尝试,如果n包含这个素数,那么就把它“除干净”,这样既可保证后面找到的因子均为素数,只需要枚举到sqrt(n)时即可停止。这样做的好处是不需要提前生成素数表即可得到n的唯一分解式。假设一共可以整除res次,那么累乘上res+1。注意最后如果n>1,说明最后n变为了一个素数,要再累乘上2。这样即可得到所有正约数的个数。
3.代码:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 1000000000+5
#define M 100000
typedef long long ll;
ll cal(int n)
{
int tmp = n;
int m = sqrt(n + 0.5);//枚举到sqrt(n)即可停止
ll cnt = 1;
for (int i = 2; i <= m;i++)
if (n%i == 0){
int res = 0;
while (n%i == 0){//除干净
n /= i; res++;
}
cnt *= (res + 1);
}
if (n > 1)cnt *= 2;//一定要有此判断
return cnt;
}
int main()
{
//freopen("t.txt", "r", stdin);
int T;
scanf("%d", &T);
while (T--)
{
ll a, b;
scanf("%lld%lld", &a, &b);
ll ans = 0, p = a;
for (ll i = a; i <= b; i++)
{
int res = cal(i);
if (ans < res){
ans = res;
p = i;
}
}
printf("Between %lld and %lld, %lld has a maximum of %lld divisors.\n", a, b, p, ans);
}
}