前言
咕~
这道题不难,只是容易超时。神犇勿入!!!
一、题意
输入两个正整数,输出以这两个数为最大公因数和最小公倍数的整数数对的对数
二、思路
1、最大公因数和最小公倍数的求法
首先,我们要了解最大公因数和最小公倍数是些什么东东
虽然小学学过
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
——百度百科
首先来看看最大公因数
在C++的STL库中,就有一个函数名为__gcd(),这就是最大公约数函数,其用法为
__gcd(a,b)
知道最大公因数,那么最小公倍数如何求呢?
记住这个公式
那么我们就可以定义一个lcm函数
int lcm(long long a,long long b)
{
return a/__gcd(a,b)*b;
}
但这个公式为啥和上面那个不一样呢?
当和等于时,,超过了的范围,会爆掉,所以要先除以最大公因数,在乘上另一整数。
2、主体部分
首先输入(废话)
long long x,y;//这里开longlong是为了后面运算方便
cin>>x>>y;
然后清零累加器
int con=0;
随即开始暴力枚举
因为整数数对要以x为最大公因数,以y为最小公倍数,所以数对里的整数一定大于等于x,小于等于y
for(long long i=x;i<=y;i++)
{
double j=x*1.0/i*y;//用公式求出另一个整数的可能值
long long check=j;//判断j是不是整数
if(check==j&&__gcd(i,check)==x&&__lcm(i,check)==y) con++;//累加
/*
因为两数相乘等于x*y不代表两数
的最大公因数和最小公倍数就是x
和y,所以还是要判断一次
*/
}
最后输出结果
cout<<con;
return 0;//华丽结束
AC CODE
#include<bits/stdc++.h>
using namespace std;
int __lcm(long long a,long long b)
{
return a/__gcd(a,b)*b;
}
int main()
{
long long x,y;
cin>>x>>y;
int con=0;
for(long long i=x;i<=y;i++)
{
double j=x*1.0/i*y;
// cout<<i<<" "<<j;
long long check=j;
if(check==j&&__gcd(i,check)==x&&__lcm(i,check)==y) con++;
}
cout<<con;
return 0;
}
下片题解再见,咕~