【搜索】【cogs 193】最多因子数
来源:互联网 发布:手机制作结婚照软件 编辑:程序博客网 时间:2024/04/30 14:56
193. 最多因子数
★★★ 输入文件:divisors.in 输出文件:divisors.out 简单对比时间限制:3 s 内存限制:128 MB
【问题描述】
数学家们喜欢各种类型的有奇怪特性的数。例如,他们认为945是一个有趣的数,因为它是第一个所有约数之和大于本身的奇数。
为了帮助他们寻找有趣的数,你将写一个程序扫描一定范围内的数,并确定在此范围内约数个数最多的那个数。不幸的是,这个数和给定的范围的都比较大,用简单的方法寻找可能需要较多的运行时间。所以请确定你的算法能在几秒内完成最大范围内的扫描。
【输入格式】
只有一行,给出扫描的范围,由下界L和上界U确定,满足2≤L≤U≤1 000 000 000。
【输出格式】
对于给定的范围,输出该范围内约数个数D最多的数P。若有多个,则输出最小的那个。
请输出“Between L and U,P has a maximum of D divisors.”,其中L,U,P和D的含义同前
面所述。
【输入输出样例】
divisors.in
1000 2000
divisors.out
Between 1000 and 2000,1680 has a maximum of 40 divisors.
题解:
我们要对一段区间进行查询,很明显并不能一个一个去验证,时间会炸的飞起。
所以我们考虑对于一个数,它的约数个数是什么?
如果我们把一个数X分解质因数——>
通过乘法原理我们可以发现,它的约数个数是
于是我们可以从质因数来下手,因为它的范围是根号n的,然后对于每个质数进行扩展就好了。
网上有不错的文章,说的很详细,这里就不多说了,可以戳这里——>对没错就是这里
Code:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define N 100001using namespace std;int num=0,ans=0,minn,anx,yes[N],no[N];void xs(){ memset(yes,0,sizeof(yes)); memset(no,0,sizeof(no)); no[0]=no[1]=1; for (int i=2; i<N; i++){ if (!no[i]) yes[num++]=i; for (int j=0; j<num && i*yes[j]<N; j++){ no[i*yes[j]]=1; if (!(i%yes[j])) break; } }}void work(int start,int s,int x,int L,int R){ if (x>=minn){ if ((s>ans) || (s==ans && x<anx)) ans=s,anx=x; } if ((L==R) && (L>x)) work(start,s<<1,x*L,1,1); for (int i=start; i<num; i++){ if (yes[i]>R) return; int j=yes[i],ll=L-1,l=L,r=R,y=x,ss=s,m=1; while (1){ m++; ss+=s; ll/=j; l/=j; r/=j; if (ll==r) break; y*=j; work(i+1,ss,y,l,r); } m=1<<m; if (s<(ans/m)) return; }}int main(){ int l,r; scanf("%d%d",&l,&r); xs(); if (l==1 && r==1) ans=1,anx=1; else { minn=l,ans=2,anx=l; work(0,1,1,l,r); } printf("Between %d and %d, %d has a maximum of %d divisors.\n",l,r,anx,ans); return 0;}
0 0
- 【搜索】【cogs 193】最多因子数
- [COGS193]最多因子数 解题报告
- CODE[VS] 1032最多因子数
- 求不超过N的正整数中因子最多的数
- COGS 1190 最大数
- [Cogs]-693-Antiprime数
- COGS 1844 最大数
- COGS 2490. 数页码
- COGS 693 Antiprime数
- cogs 99 查数
- cogs 693. Antiprime数
- hihocoder1165 益智游戏 (最多因子)
- COGS 1260 三元数对
- 三角数因子数
- 【HDU5527 2015长春赛区A】【贪心 特判模拟】Too Rich 最多硬币数支付 因子思想 贪心打补丁
- Cogs 1844. [JSOI2008]最大数maxnumber
- 整数因子数
- 数因子拆分法
- Java正则表达式匹配
- drawRect:和layoutSubview的区别
- 指针数组与数组指针
- 15第十六项目三——max带来的冲突
- POJ 1276 Cash Machine(多重背包问题)
- 【搜索】【cogs 193】最多因子数
- 加入购物车功能实现
- SVG画圆形进度条
- 第十五周oj刷题——Problem H: C++ 习题 输出日期时间--友元类
- PAM模块
- 第16周上机实践项目3——max带来的冲突
- Python可执行对象——exec、eval、compile
- 与C++输入输出有关的类和对象
- java 从zip包中复制文件