1266: gcd和lcm
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lldSubmitted: 155 Accepted: 35
[ Submit][ Status][ Web Board]
Description
已知a,b的最大公约数为x,也即gcd(a,b)=x; a,b的最小公倍数为y,也即lcm(a,b)=y.给出x,y.求满足要求的a和b一共有多少种。
Input
多组测试样例。每组给两个整数x,y.(1<=x<=100000,1<=y<=1000000000).
Output
对于每个测试样例,输出一个整数,表示满足要求的(a,b)的种数。
Sample Input
3 60
2 2
Sample Output
4
1
HINT
题目数据范围做了少许改动。
Source
现在有两个数字a0,b0
设他们的最小公倍数为lcm,最大公约数为gcd
则存在下面的关系:
a1=a0/gcd,b1=b0/gcd(a1,b1为a0,b0中的不重复的因子的乘积)
所以有 lcm=a1*b1*gcd
本题目的思路及是枚举出a1的所有情况。
注意边界 a1的范围为 1到 (根号(lcm/gcd))
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
#include<map>
using
namespace
std;
#define N 10005
int
main()
{
int
x,y;
while
(
scanf
(
"%d%d"
,&x,&y)!=EOF)
{
int
num=0;
int
a,b,ab;
ab=1;
if
(y%x!=0)
{
puts
(
"0"
);
continue
;
}
if
(y==x)
{
puts
(
"1"
);
continue
;
}
ab=y/x;
for
(
int
i=1;i*i<ab;i++)
{
a=i;
b=ab/a;
if
(ab%a!=0)
{
continue
;
}
if
(__gcd(a,b)==1)
{
num+=2;
}
}
printf
(
"%d\n"
,num);
}
}
/**************************************************************
Problem: 1266
User: drowner
Language: C++
Result: Accepted
Time:2 ms
Memory:1680 kb
****************************************************************/