该题运用了唯一分解定律,详情请见lrj紫书P321,一个数的约数的个数就是将该数唯一分解之后,各质因子的系数+1之积 。虽然有一个快速算每一个数的约数个数的欧拉phi函数值,但是该题的数据范围非常大,数组存不下,而且区间差非常小,显然事先算出每一个数的约数个数不是一个明智的决定。 所以我们用的时候再算也不迟。 那么我们需要事先打出素数表,要多少素数呢? sqrt(10^9)就够了,因为如果一个素数比这个值还大,那么她的平方肯定超过了10^9,不在数据范围内,得到的系数一定是1,相当于没有乘。
细节参见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 55555;
int T,n,m,cnt = 0,vis[maxn+5],prime[maxn+5];
ll a,b;
void init() {
int m = sqrt(maxn+0.5);
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;
}
ll C(int n,int cnt) {
ll sum = 1;
for(int i=0;i<cnt;i++) {
int cur = 1;
while(n % prime[i] == 0) {
n /= prime[i];
cur++;
}
sum *= cur;
}
return sum;
}
int main() {
init();
scanf("%d",&T);
while(T--) {
ll ans = 0, res = 1;
scanf("%lld%lld",&a,&b);
for(ll i = a; i <= b; ++i) {
ll cur = C(i,cnt);
if(cur > ans) {
ans = cur;
res = i;
}
}
printf("Between %lld and %lld, %lld has a maximum of %lld divisors.\n",a,b,res,ans);
}
return 0;
}

本文介绍了一种在大数据范围内高效计算数值约数个数的方法。利用唯一分解定律,通过预处理素数表来实现对指定区间内每个整数约数个数的有效计算。文章提供了一段C++代码示例,展示了如何运用欧拉phi函数思想,避免预先存储所有数值的约数个数。

被折叠的 条评论
为什么被折叠?



