UVa 294 Divisors

来源:互联网 发布:单片机控制直流电机 编辑:程序博客网 时间:2024/05/18 18:15

题意:求[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;   }
1 0
原创粉丝点击