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

輸入二個正整數x0,y0(2≤x0≤100000,2≤y0≤1000000),求出滿足下列條件的P、Q的個數。
條件:1.P、Q是正整數
2.要求P、Q以xO為最大公約數,以yO為最小公倍數。
試求,滿足條件的所有可能的兩個正整數的個數。

看完之后第一眼暴力,然后發現暴力貌似O(n^2)會炸,然后開始分析如何解決。。

首先,眾所周知lcm(a,b)=a*b/gcd(a,b),那么我們就可以把P、Q表示出來了。

P>=x
Q>=x
gcd(P,Q)=x
lcm(P,Q)=y

那么我們看一下以后一個式子,將gcd帶進去。

lcm(P,Q)=P*Q/gcd(P,Q)=P*Q/x=y
P*Q=x*y
Q=x*y/P

好了,也就是說我們可以根據P求出Q的值,也就是說枚舉P就可以了,所以O(n^2)下降到了O(n)。

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

typedef long long int t;
t x,y,ans;
inline t gcd(t a,t b){return b?gcd(b,a%b):a;}
int main(){
    scanf("%lld%lld",&x,&y);
    for(int i=1;i*x<=y;i++)
        ans+=!(y%i)&&gcd(i*x,y/i)==x;
    printf("%lld\n",ans);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容