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) 这个自己想一下。
【代码】
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; }
相关文章推荐
- UVA 294 294 - Divisors (数论)
- UVa294 - Divisors
- UVA 294(p344)----Divisors
- UVa 294 - Divisors
- uva 294 ——Divisors
- uva 294 - Divisors(枚举+计数)
- UVa294 Divisors
- UVa 294 - Divisors(唯一分解)
- UVa 294 - Divisors
- UVa 294 - Divisors(数学)
- UVa 294 - Divisors
- UVa 294 - Divisors
- UVA 294 Divisors(唯一分解定理 + 除数函数)
- UVa 294 - Divisors
- uva294 Divisors
- Divisors UVA - 294
- UVA 294 - Divisors 因子个数
- UVA294 - Divisors
- uva 294 divisors
- 习题10-9 UVA 294 Divisors(约数)