最大公约数与最小公倍数问题

原创 2006年06月22日 18:02:00

[问题描述]
输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
条件:1、P、Q是正整数
2、要求P、Q以xO为最大公约数,以yO为最小公倍数。
试求,满足条件的所有可能的两个正整数的个数。
[样例]
输入:x0=3 y0=60
输出:4
说明:(不用输出)此时的 P Q 分别为,
3 60
15 12
12 15
60 3
所以,满足条件的所有可能的两个正整数的个数共4种。

知识准备:

 p,q的最大公约数为x0,则:

 p%x0=0,q%x0=0

假设 p1=p/x0   q1=q/x0

进行如下推导:

1。如果p1=q1,则根据最大公约数的定义,p1=q1=1,p=q=x0,根据最小公倍数的定义,p=q=y0,   x0=y0=p=q

2.如果p1!=q1,根据最大公约数的定义,p1q1除了1以外没有其他相同的因子,即p1,q1互质。

3.根据最小公倍数的定义,y0=pq/x0, p1=p/x0,q1=q/x0,则可推出如下的等式:p1q1=y0/x0.

  根据以上分析,可以推出以下算法:

 

   1。如果y0%x0!=0,p,q不存在。

   2。如果y0=x0,则存在一组p,q,p=q=x0=y0

   3. 1y0/x0之间查找满足p1q1=y0/x0p1,q1互质的数据对。

 

参考程序如下:

#include<iostream>

#include<cstdio>

using namespace std;

long x,y,p,q,i,s;

int hz(long p,long q)//判断p,q互质

{

    long j;

    for(j=2;j<=p;j++)

    if(p%j==0&&q%j==0)

       return 0;

    return 1;  

   

}    

int main()

 {  

     freopen("in.txt","r",stdin);

     freopen("out.txt","w",stdout);

     while(cin>>x>>y)

     {

         if(y%x!=0)

           cout<<0<<endl;

         else if(y==x)cout<<1<<endl;

         else

            {

                s=0;

                i=y/x;

                for(p=1;p<=i;p++)

                 for(q=1;q<=i;q++)

                  if((p*q==y/x)&&hz(p,q))

                    s++;

             cout<<s<<endl;  

            }     

     }   

     return 0;

 }   

 

二。对算法的改进

1.猜想

   根据前面的分析:如果p,q的最大公约数为x,最小公倍数为y,则只要查找满足乘积为y/x且互质的p1,q1数据对就可以了。这样的数据对个数有没有规律呢?

猜想:设y0/x0的质因子个数为k,则满足条件的p,q对个数为2^k,即集合中子集合的数目。

证明:

假设y0/x0k个质因子,y0/x0=a1*a1*…ak (ai是质数,算术基本定理)

要使得p1*q1=y0/x0,p1,q1互质,则p1,q1不能含有相同的的质因子,因此p1,q1的选择总数为

如何统计整数s的质因子个数k?最简单的方法是线性查找。2开始依次累加,第一个能整除s的数据必然为质因子,通过循环整除操作排除该质因子后,下一个能整除s的数据还是质因子。

算法如下:

1. i=2;

2. While (s%i!=0) s++;

3. K++;

4. While (s%i==0)  s=s/i;

5. 继续执行语句2

参考程序如下:

#include<iostream>
#include<cstdio>
using namespace std;
long x,y,p,q,i,s,j,k;
long total;//保存2^k  
int main()
 {  
     freopen("in.txt","r",stdin);
     freopen("out.txt","w",stdout);
     while(cin>>x>>y)
     {
         if(y%x!=0)
           cout<<0<<endl;
         else if(y==x)cout<<1<<endl;
         else
            {
                s=0;
                i=y/x;
                j=2;
                while(i>1)
              { 
                while(i%j!=0)  j++;
                s++;
                while(i%j==0) i=i/j;
              }   
                total=1;
                for(j=1;j<=s;j++)
                 total*=2;  //计算2^k 
             cout<<total<<endl;  
            }     
     }   
     return 0;
 }   

相关文章推荐

[noip2001普及(初中)组] 第二题《最大公约数和最小公倍数问题》解题报告

题目描述Description 输入二个正整数x0,y0(2 条件:  1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个正整数的个数. ...

wikioi1012 最大公约数和最小公倍数问题(2001年NOIP全国联赛普及组)

题目描述 Description 输入二个正整数x0,y0(2 条件:  1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所...

1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组

1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Descript...

最大公约数和最小公倍数问题

题目描述 Description 输入二个正整数x0,y0(2 条件:   1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个...

NOIP2001普及组 最大公约数和最小公倍数问题

最大公约数和最小公倍数问题 http://218.5.5.242:9018/JudgeOnline/problem.php?id=1111 时间限制: 1 Sec   内存限制: 128 M...

C++求最小公倍数和最大公约数问题

这道题的解答就是求三个数(假设为想x,y,z)的最小公倍数,通过转化,这个最小公倍数可以转化成x*y*z÷最大公约数(x,y)÷最大公约数(x*y,z);所以问题的解答编程了如何求最大公约数的问题上了...

Wikioi 天梯 最大公约数和最小公倍数问题(1012)

题目描述 Description 输入二个正整数x0,y0(2 条件:  1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所...

求解最大公约数和最小公倍数问题

思路: 最大公约数问题也是一个非常典型的递归算法的应用。每次递归使得原来求两个大数之间的公约数转变成求两个稍微小点的数之间的公约数,要求转换的过程要保证不会改变公约数的值。这就要看其中转换的原理了。...

1012 最大公约数和最小公倍数问题

解法一、枚举法 [解题思路]      P,Q 以x0为最大公约数,通过碾转相除法求得到x0,y0为最小公倍数,通过P*Q/x0可以求得y0,根据最大公约数与最小公倍数的关系可以得到 P*Q=x0*y...

算法 数的计算 最大公约数和最小公倍数问题

数的计算: 题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n 1.          不作任何处理; 2.   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大公约数与最小公倍数问题
举报原因:
原因补充:

(最多只允许输入30个字)