Divisors
,
约数的个数为:
先打素数表,
唯一分解得出
,计算出约数的个数
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1e5;
//欧拉筛法( O(n) )
int np=0,p[maxn],v[maxn+10];
int gg(int n){
for(int i=2;i<=n;i++){
if(!v[i]) p[++np]=i;//此时的i为某个质数
for(int j=1;j<=np && i*p[j]<=n;j++){
v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
if(i%p[j]==0) break;
}
}
return np;
}
int t,l,r;
int main(){
gg(maxn);
cin>>t;
while (t--)
{
scanf("%d%d",&l,&r);
ll ans=0;
int index=0;
for(int n=l;n<=r;n++)
{
int N = n;
ll res=1;
//唯一分解
for(int i=1;i<=np ;i++)
{
if(p[i]>N)
break;
int c=0;
while(N%p[i]==0) {
c++;
N/=p[i];
}
res*= c+1;
}
if(N>1) //以防自己就是素数
res*=2;
//更新答案
if(res>ans)
{
ans = res;
index = n;
}
}
printf("Between %d and %d, %d has a maximum of %lld divisors.\n",l,r,index,ans);
}
return 0;
}