題目描述 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 Input3 60
樣例輸出 Sample Output4
首先我們要知道兩個數的乘積等於這兩個數的最大公約數與最小公倍數的乘積
證明如下:
假設兩個數為 a和b,他們的最大公約數是a/c,
那么他們的最小公倍數為 (a/c) * a/(a/c) * b/(a/c)
化簡后得 b*c
所以 最大公約數 乘以 最小公倍數 = (a/c) * (b*c) =a*b
那么他們的最小公倍數為 (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 }