问题
分析
这题主要是求解一个数n的正约数个数问题
首先对n进行唯一因数分解,然后将因数的个数都加一,求他们的积,就是正约数个数
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
typedef long long LL;
const LL maxn=32000,Inf=0x3f3f3f3f;
int isprime[maxn],prime[maxn],pn=0,factor[maxn],pf=0;
void getPrime(){
fill(isprime,isprime+maxn,1);
for(LL i=2;i<maxn;++i){
if(isprime[i]) prime[pn++]=i;
for(int j=0;j<pn && i*prime[j]<maxn;++j){
isprime[i*prime[j]]=0;
if(i%prime[j]==0) break;
}
}
}
int cnt(int x){
pf=0;
for(int i=0;i<pn;++i){
int t=0;
while(x%prime[i]==0){
x/=prime[i];
++t;
}
if(t!=0) factor[pf++]=t;
if(x==1) break;
}
if(x>1){
factor[pf++]=1;
}
int ans=1;
for(int i=0;i<pf;++i){
ans*=(factor[i]+1);
}
return ans;
}
int n,L,U;
int main(void){
getPrime();
scanf("%d",&n);
while(n--){
scanf("%d%d",&L,&U);
int ans=0,divid=0;
for(int i=L;i<=U;++i){
int t=cnt(i);
if(t>divid){
ans=i;
divid=t;
}
}
printf("Between %d and %d, %d has a maximum of %d divisors.\n",L,U,ans,divid);
}
}