1. 程式人生 > >洛谷 P1029 最大公約數和最小公倍數問題 gcd&lcm

洛谷 P1029 最大公約數和最小公倍數問題 gcd&lcm

題目描述

輸入22個正整數x_0,y_0(2 \le x_0<100000,2 \le y_0<=1000000)x0,y0(2x0<100000,2y0<=1000000),求出滿足下列條件的P,QP,Q的個數

條件:

  1. P,QP,Q是正整數

  2. 要求P,QP,Q以x_0x0為最大公約數,以y_0y0為最小公倍數.

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

輸入輸出格式

輸入格式:

 

22個正整數x_0,y_0x0,y0

 

輸出格式:

 

11個數,表示求出滿足條件的P,QP,Q的個數

 

輸入輸出樣例

輸入樣例#1:  複製
3 60
輸出樣例#1:  複製
4

說明

P,QP,Q有4種

1、3,60
2、15,12
3、12,15
4、60,3

 

作為一個數論渣,就是這種題都看不懂。。。。

首先貼出一個結論:gcd(a,b)*lcm(a,b)=a*b  (根本不會證明。。)

由此得出這道題的思路,題目已經給出了gcd(a,b)和lcm(a,b),我們把他們乘起來,然後暴力列舉a,如果找到的a,b滿足gcd(a,b)==a,就找到了兩個解,ans+=2即可

注意要特判x0==y0的情況,這種情況下只有x0,y0一組解,直接輸出1

完整程式碼

#include<bits/stdc++.h>
using namespace std;
int x,y,ans,k;
int gcd(int a,int b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
int main()
{
    cin>>x>>y;k=x*y;
    if(x==y)
    {
        cout<<'1';
        return 0;
    }
    for(int i=x;i*i<=k;i++)
       {
           
if(k%i==0&&gcd(i,k/i)==x)ans+=2; } // cout<<gcd(x,y); cout<<ans; return 0; }

參考大佬@justin_cao的題解