最大公約數和最小公倍數問題


題目描述  Description

輸入二個正整數x0,y0(2<=x0<100000,2<=y0<=1000000),求出滿足下列條件的P,Q的個數

條件:  1.P,Q是正整數

2.要求P,Q以x0為最大公約數,以y0為最小公倍數.

試求:滿足條件的所有可能的兩個正整數的個數.

 

輸入描述  Input Description

二個正整數x0,y0

 

輸出描述  Output Description

滿足條件的所有可能的兩個正整數的個數

 

樣例輸入  Sample Input

3 60

 

樣例輸出  Sample Output

4

首先我們要知道兩個數的乘積等於這兩個數的最大公約數與最小公倍數的乘積

證明如下:

假設兩個數為 a和b,他們的最大公約數是a/c,
那么他們的最小公倍數為 (a/c) * a/(a/c) * b/(a/c)
化簡后得 b*c
所以 最大公約數 乘以 最小公倍數 = (a/c) * (b*c) =a*b
所以兩個數的乘積等於這兩個數的最大公約數與最小公倍數的乘積
 
附AC代碼:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int main(){
 8     int x,y,num,ans=0,a,n,m,r;
 9     cin>>x>>y;
10     num=x*y;//num即為兩數乘積 
11     for(int i=x;i*i<num;i+=x){//可以證明當i*i<num,出現的滿足條件數字組合是i*i<m中滿足條件的數字組合的相反組合,
12     //i*i=num肯定的是不滿足的。i一定要是最大公因數的x倍,所以直接+=x 
13         if(num%i==0){//保證num/i是一個整數
14             a=num/i;//另一個數 
15             if(a%x==0){//保證a可以除盡最大公因數
16                 n=i/x;
17                 a=a/x;
18                 r=n%a;
19                 while(r!=0){
20                     r=n%a;
21                     n=a;
22                     a=r;
23                 }//判斷同時除以n后兩數是否還有其他公因數
24                 if(n==1||i/x==1)//互質 
25                 ans+=2;//因為是正反兩種所以直接加二 
26             }
27             
28         }
29     }
30     cout<<ans<<endl;
31     return 0;
32 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM