算法课最多约数问题

Posted osea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法课最多约数问题相关的知识,希望对你有一定的参考价值。

题目描述

正整数 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 
View Code

 

【方法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 
View Code

 

以上是关于算法课最多约数问题的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》0x32约数

icodelab 最多的约数

找到两个数字的公约数的最有效方法,最多为 10^6

约数(试除法求约数,约数之和,约数之差,欧几里得算法)

Sumdiv|同余|约数|拓展欧几里得算法

基础算法基础算法转载