【算法课】最多约数问题

题目描述

正整数 x 的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。设 a 和 b 是两个正整数,找出 a 和 b 之间(包含a,b)约数个数最多的数 x 的约数个数

输入

两个正整数a和b,(1<=a<=b<=1e5)

输出

一个正整数表示答案。

样例输入

1 36

样例输出

9


【方法1】线性筛

 1 /*
 2     Test1 : 线性筛的做法
 3 */
 4 #include<bitset>
 5 #include<cstdio>
 6 #include<iostream>
 7 using namespace std;
 8 typedef long long ll;
 9 const int N = 1e6+10;
10
11 int Prime[N],Cnt[N];
12 bool is_prime[N];
13 int A,B,Ans=2;
14
15 int Count_Prime ( int x , int p ){
16     int tot = 0 ;
17     while( x % p == 0 ){
18         tot ++ ;
19         x /= p ;
20     }
21     return tot ;
22 }
23
24 void Is_prime(){
25     //memset( is_prime , 0 , sizeof(is_prime) );
26     for(int i=1;i<N;i++) Cnt[i] = 1 ;
27     for(int i=2;i<N;i++){
28         if( !is_prime[i] ){
29             for(int j=i*2 ; j < N ; j+=i ){
30                 Cnt[j] *= ( Count_Prime( j , i ) + 1 ) ;
31                 is_prime[j] = true ;
32                 if( A <= j && j <= B ){
33                     if( Ans < Cnt[j] )
34                         Ans = Cnt[j] ;
35                 }
36             }
37         }
38     }
39 }
40 int main()
41 {
42     scanf("%d%d",&A,&B);
43     Is_prime() ;
44     /*
45     for(int i=A;i<=B;i++){
46         printf("%d , %d\n",i,Cnt[i]);
47     }
48     */
49     if( A == B && A == 1 ) Ans = 1 ;
50     printf("%d\n",Ans);
51     return 0;
52 }

【方法2】搜索

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e5+10;
 4 int prime[] = { 0,2,3,5,7,11,
 5                 13,17,19,23,29,
 6                 31,37,41,47,51};
 7 int A , B ;
 8 int Ans = 2 ;
 9
10 int dfs( int Num , int pos ,int k , int Cnt ){
11
12     if( pos > 15 ) return 2;
13     int res = Cnt;
14     for(int i=1;i<=k;i++){
15         if( B/prime[pos] < Num ) break ;
16         Num *= prime[pos] ;
17         res = max( res , dfs( Num ,pos+1 , i , Cnt*(i+1) ) );
18     }
19     if( A <= Num && Num <= B ){
20         if( Cnt > Ans ) Ans = Cnt ;
21     }
22
23     return res;
24 }
25
26 int main()
27 {
28     scanf("%d%d",&A,&B);
29     if( !(A^1) && A == B ){
30         Ans = 1 ;
31     }else{
32         dfs( 1 , 1 ,64 , 1 );
33     }
34     printf("%d\n",Ans);
35     return 0 ;
36 }

原文地址:https://www.cnblogs.com/Osea/p/11438050.html

时间: 2024-11-01 11:27:58

【算法课】最多约数问题的相关文章

NOJ1203 最多约数问题 [搜索 数论]

传送门 njczy2010 1203 Accepted 79MS   1400K 2321Byte G++ 2015-01-25 13:14:25.0 最多约数问题 时间限制(普通/Java) : 20000 MS/ 30000 MS          运行内存限制 : 81920 KByte总提交 : 431            测试通过 : 52  题目描述 正整数x的约数是能整除x的正整数.正整数x的约数个数记为div(x).例如,1,2,5,10都是正整数10的约数,且div(10)=

算法课笔记系列(六)—— 图(Part2)

上一周去了一趟说走就走的治疗之旅,所以算法课都没能上.:( 不过,人生有过这样一次,很足够.只要永远做自己认为对的事情就不会有跨不过去的坎. 跟上周一样,这一周的内容包含几个小部分,分别为最短路径动态规划.所有点对之间的最短路径和网络流. 第一部分:最短路径动态规划 对于一个有向图G=(V, E), 每一条边权重为cvw(权重可为负), 问题是找到从节点s到t的最短的路径.如果边的权重中有负值,则Dijkstra方法不适用.因此我们想到一个办法,给每一个权值加上一个正常数使得每一条边的权重都为非

最多约数问题

问题名称:最多约数问题. 问题描述:正整数x的约数是能整除x的正整数.正整数x的约数个数记为div(x).例如,1,2,5,10都是正整数10的约数,且div(10)=4.设a和b是2个正整数,a<=b,找出a和b之间约数个数最多的数x. 数据输入:输入数据由input.txt文件提供,第1行有2个正整数a和b(分开). 结果输出:程序运行结束时,若找到的a和b之间约数个数最多的数是x,将div(x)输出到output.txt中.

Construct Binary Tree from Inorder and Postorder Traversal (算法课上的题)

Construct Binary Tree from Inorder and Postorder Traversal 这道题之前算法课上好像遇到过,思路也很简单的. 思路:后序序列的最后一个元素就是树根,然后在中序序列中找到这个元素(由于题目保证没有相同的元素,因此可以唯一找到),中序序列中这个元素的左边就是左子树的中序,右边就是右子树的中序,然后根据刚才中序序列中左右子树的元素个数可以在后序序列中找到左右子树的后序序列,然后递归的求解即可.(在去除了根节点之后,中序遍历和后序遍历的前N个树都是

[算法课][分治]寻找凸包 (Convex Hull)

凸包问题是算法中经典的题目了,最近算法课讲分治问题时提到了Convex Hull,算法导论的书上也花了篇幅讨论了Convex Hull的求解,主要是Graham方法. 为了能更好地理解分治和Graham这两种解法,我决定自己动手把代码写一遍. 然而,在写之前,我发现我大一学的用行列式求解由三个点围城的三角形面积已经忘得差不多了,现在补充一下: 利用这个计算结果来判断点p3在p1p2直线的左侧还是右侧 下面是分治算法求解: #include <iostream> #include <alg

普林斯顿算法课Part2第二周作业_SeamCarving

作业地址:http://coursera.cs.princeton.edu/algs4/assignments/seamCarving.html 作业难点: 1.如何获取图形的RGB属性? 需要研习下Picture.Color类等,使用getRGB().getRed().getGreen().getBlue()等函数; 2.如何计算从顶端到底部的最低energy曲线(即最短路径)? 使用课上讲的Dijkstra算法求解即可: 3.是否将findHorizontalSeam和findVertica

普林斯顿大学算法课 Algorithm Part I Week 3 排序算法复杂度 Sorting Complexity

计算复杂度(Computational complexity):用于研究解决特定问题X的算法效率的框架 计算模型(Model of computation):可允许的操作(Allowable operations) 成本模型(Cost model):操作数(Operation counts) 上界(Upper bound):最多的成本 下界(Lower bound):最少的成本 最优算法(Optimal algorithm):最有可能性的成本的算法(Algorithm with best pos

算法课笔记系列(七)—— 平摊分析

本周的内容是Amortized Analysis,是对算法复杂度的另一种分析.它的基本概念是,给定一连串操作,大部分的操作是非常廉价的,有极少的操作可能非常昂贵,因此一个标准的最坏分析可能过于消极了.因此,其基本理念在于,当昂贵的操作也别少的时候,他们的成本可能会均摊到所有的操作上.如果人工均摊的花销仍然便宜的话,对于整个序列的操作我们将有一个更加严格的约束.本质上,均摊分析就是在最坏的场景下,对于一连串操作给出一个更加严格约束的一种策略. 均摊分析与平均情况分析的区别在于,平均情况分析是平均所

算法课笔记系列(八)——NP问题及其计算复杂性

本周的内容是NP问题,NP的全称是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题.百度上对NP的解释是,P/NP问题是在理论信息学中计算复杂度理论里至今没有解决的问题.通俗的说,是将不可知的问题转化为已知的问题,进而计算器复杂度. 首先介绍多项式时间的约减,即Polynomial-Time Reductions,通过解决另一个不同问题的假设的子程序,使用不包含子程序在内的多项式时间来解决一个问题的方法.主观上,一个多项式时间约减证明了第一个问题不比第二个