博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LuoguP1221]最多因子数
阅读量:5032 次
发布时间:2019-06-12

本文共 2242 字,大约阅读时间需要 7 分钟。

[Luogu1221]最多因子数()

求区间[L,R]内约数个数最多的数和它的约数个数。

这个题吧,乍一看确实不是很难,然后稍微一想,嗯,是个傻*题。这是唯一感受,不要问我为什么。

首先我们定义一个函数\(F(X)\)表示\(X\)的约数个数。题目要求求出\([L,R]\)中的\(F(X)max\)和这个数。首先最基本我们要知道每一个数\(Data[i]\)都一个基本性质:

\(Data[i] = Prime_1^{M_1} \times Prime_2^{M_2} \times ... \times Prime_N^{M_N}\),语言表示就是任意i一个数都可以分解成多个质数的若干次方的乘积,稍微搞一搞我们得到\(F(X) = (M_1 + 1) \times (M_2 + 1) \times ...\times (M_N + 1)\)

由此将搜索的过程由质因数分解转化为了质因数相乘,则搜索的时候只需要搜索质因数就可以了,然后记录质因数的个数即可。当然,单纯这样搞是会\(T\)掉的,下面数一下剪枝:

  1. 按照递增顺序搜索每一个质数。
  2. 枚举质数的指数。如果当前枚举的质数算上指数的乘积为\(X\),下一次枚举的时候指数为\(Y\),如果\(X \times Y > R\),超过了区间的右端点,直接\(return​\)。这个是很显而易见的。
  3. 如果当前的质数算上指数的乘积在\([L, R]\)之间,那么代表它有可能更新答案,而\(R - L < X\)的时候,我们也直接\(return\),因为下一次搜索一定搜不到\([L, R]\)之间的数,所以zhi直接跳出。
#include 
#include
#include
#include
#include
using namespace std ;typedef long long LL ;const int MAXN = 500010 ;const int MAXM = 40000 ;int L, R, Ans, Max, Prime[MAXN] ;bool NotP[MAXN] ; int Tot ;inline void Dfs(LL H, LL N, LL Now) { if (H > Tot || N > R) return ; int K = (int)(log(R / double(N)) / log(double(Prime[H]))) ; if (Now * (1 << K) < Ans) return ; if (N >= L && (Now > Ans || (Now == Ans && N < Max))) Ans = Now, Max = N ; LL X = 1 ; for (int i = 1 ; i <= K ; i ++) X *= Prime[H] ; for (int i = K + 1 ; i >= 1 ; i --) { Dfs(H + 1, N * X, Now * i) ; X /= Prime[H] ; } return ;}int main() { scanf("%d %d", & L, & R) ; if (L == R && L == 1) { printf("Between %d and %d, 1 has a maximum of 1 divisors.\n", L, R); return 0 ; } for (int i = 2 ; i <= MAXM ; i ++) { if (! NotP[i]) { Prime[++ Tot] = i ; for (int j = i << 1 ; j <= MAXM ; j += i) NotP[j] = true ; } } if (R - L <= 10000) { for (int i = L ; i <= R ; i ++) { int T = 2 ; for (int j = 2 ; j * j <= i ; j ++) { if (j * j == i) T ++ ; else if (i % j == 0) T += 2 ; } if (T > Ans) Ans = T, Max = i ; } } else Dfs(1, 1, 1) ; printf("Between %d and %d, %d has a maximum of %d divisors.\n", L, R, Max,Ans); return 0 ;}

转载于:https://www.cnblogs.com/Yeasio-Nein/p/P1221.html

你可能感兴趣的文章
四六级作文常见错误解析(转载)
查看>>
Tomcat
查看>>
./是当前目录 ../是当前的上一级目录。上上级就是../../一般绝对路径时候常用...
查看>>
树的递归与非递归遍历方法
查看>>
每天一个Linux命令(6):rmdir命令
查看>>
oracle连接的三个配置文件(转)
查看>>
RecyclerView 局部刷新(获取viewHolder 去刷新)
查看>>
PHP表单(get,post)提交方式
查看>>
使用vbs或者bat脚本修改IE浏览器安全级别和选项
查看>>
Silverlight入门
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>
[HNOI2012]永无乡 线段树合并
查看>>