您的位置:首页 > 其它

UVa 294 Divisors

2016-09-23 23:53 309 查看
题意:求[L,R]中哪个数的约数最多。

L<=R<=10^9,R-L<=10000

【分析】

暴力枚举+唯一分解定理就过了…

对于每个数x,可以变为 x=a1^p1+a2^p2+…am^pm(a数组为线性筛筛出的质数)

那么x的约数个数为 (p1+1)* (p2+1)* … *(pm+1) 这个自己想一下。

【代码】

//UVa 294 Divisors
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=40000;
int n,T;
int pri[mxn+5],cnt[mxn+5];
bool vis[mxn+5];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void shai()
{
int i,j;
fo(i,2,mxn)
{
if(!vis[i]) pri[++pri[0]]=i;
fo(j,1,pri[0])
{
if(i*pri[j]>mxn) break;
vis[i*pri[j]]=1;
if(i%pri[j]==0)
break;
}
}
}
inline int fenjie(int x)
{
int i,j,ans=1;
int m=sqrt(x);
for(i=1;i<=pri[0] && i<=x;i++)
{
int sum=0;
while(x%pri[i]==0)
{
x/=pri[i];
sum++;
}
ans*=(sum+1);
if(x==1) break;
}
if(x>1) ans*=2;
return ans;
}
int main()
{
int i,j,l,r,t,k;
shai();
T=read();
fo(t,1,T)
{
l=read(),r=read();
int mx=0,tmp;
fo(i,l,r)
if((tmp=fenjie(i))>mx)
{
mx=tmp;
k=i;
}
printf("Between %d and %d, %d has a maximum of %d divisors.\n",l,r,k,mx);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: