跳到主要内容

最大公约数

欧几里得算法

原理

image.png

gcd(a,b)=gcd(b,a mod b) gcd(a,0)=a

代码

int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

题目

输入两个正整数 x0,y0x_0, y_0,求出满足下列条件的 P,QP, Q 的个数:

  1. P,QP,Q 是正整数。
  2. 要求 P,QP, Qx0x_0 为最大公约数,以 y0y_0 为最小公倍数。

试求:满足条件的所有可能的 P,QP, Q 的个数。

思路

image.png

代码

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

LL x,y,ans;
LL gcd(LL a,LL b){
return b? gcd(b,a%b):a;
}

int main() {
cin>>x>>y;
LL t=x*y;
for(LL i=1;i*i<=t;i++)
if(t%i==0 && gcd(i,t/i)==x)
ans+=2;
if (x==y) ans--;
cout<<ans;
return 0;
}