[noip2001普及组] T2 最大公约数和最小公倍数问题 解题报告

题目描述Description

输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数

条件:
1.P,Q是正整数

2.要求P,Q以x0为最大公约数,以y0为最小公倍数.

试求:满足条件的所有可能的两个正整数的个数.

输入描述Input Description

二个正整数x0,y0

输出描述Output Description

满足条件的所有可能的两个正整数的个数

样例输入Sample Input

3 60

样例输出Sample Output

4

看这篇博客的分析http://zhurui250.blog.163.com/blog/static/137270520201162414616998/

粘贴过来

【分析】
gcd(a,b)为数a与数b的最大公约数(Greatest Common Divisor),lcm(a,b)为数a与数b的最小公倍数(least common multiple)。

题目给出了gcd(p,q)和lcm(p,q),让我们求解p,q的正整数解数。
设s=lcm(p,q)/gcd(p,q),问题化为求解 xy=s 且 gcd(x,y)=1 的正整数解数。

——————————————–补充———————————————-

因为

设gcd(p,q) = G lcm(p, q) = L

根据lcm性质 p*q/G = L 且 p|G q|G (整除)

则两边同时除G

p/G * q/G = L / G = s,由gcd性质可知 p/G与q/G互质

则原问题就变为了x*y=s 并且gcd(x, y)=1


因式分解就可以得到。

然后枚举s的因数x,得到另一个因数y,判断gcd(x.y)是否等于1即可。详见程序1

这里讲一个更有数学味的算法,希望大家看完。

按照上面的分析,无非就是把问题转化成为了求S的因数集合中,两两互质的数对的个数。
设 s=a[1]^p[1]*a[2]^p[2]*a[3]^p[3]……*a[n]^p[n]
设 x是s的一个因数,相对的因数是y=s/x

一定不存在ai,a[i]|x且a[i]|y
于是,如果 a[i]|x,因为s=xy,所以 a[i]^p[i]|x 且,不存在a[i]|y (符号打不出来,这里表示不同余)
设 b[i]=a[i]^p[i]
s总共有n个质因数,那么答案一定是 2^n

这里用语言简单说明一下,通过刚才的证明,有xy=s,所以 x 必为 b数组中若干不相同元素的乘积,那么不是x因数的 b数组中的元素,一定是y的因数,那么考虑会选择哪几个元素相乘得到x,必然用二进制加以枚举。

也就是说 s 有 n 中质因数,则一定有 2^n 种答案。

你可能感兴趣的:(数学,数论)