数学解法
2026-07-24 23:58:52
发布于:上海
9阅读
0回复
0点赞
直接分享两个公式 :
求两数最大公倍数 :
a 为其中较大的数,b为其中较小的数。
设变量 ans。
ans = a % b,a = b % ans,b = ans % a (不断变小) 重复以上步骤直到a,b,ans中有一个为0时,输出被取余的数(如 ans % a = 0,此时b = 0,输出a)
两数最小公倍数和最大公约数的关系 :
a * b = gcd(a,b) * lcm(a,b),即两数乘积等于最大公约数与最小公倍数的乘积。
接下来就好办了,在此我只遍历了sqrt(gcd(a,b) * lcm(a,b))遍,再将结果乘2输出节约时间,不过事后发现没有必要。
以下是AC程序:
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){//求最大公倍数部分
int m = max(a,b),n = min(a,b);
int t;
while (true) {
t = m%n;
if (t == 0) return n;
m = n%t;
if (m == 0) return t;
n = t%m;
if (n == 0) return m;
}
}
int main() {
int x,y,cnt = 0;
cin >> x >> y;
int c = x*y;
for (int i = x;i <= sqrt(c);i ++){
if (c % i != 0) continue;//i一定要能整除
if (gcd(i,c/i) == x){
cnt ++;
}
}
cout << cnt*2;//记得乘2
}
谢谢!
这里空空如也






有帮助,赞一个