洛谷 P1029 最大公約數和最小公倍數問題 gcd&lcm
阿新 • • 發佈:2018-11-02
題目描述
輸入22個正整數x_0,y_0(2 \le x_0<100000,2 \le y_0<=1000000)x0,y0(2≤x0<100000,2≤y0<=1000000),求出滿足下列條件的P,QP,Q的個數
條件:
-
P,QP,Q是正整數
-
要求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的題解