题目大意
给定正整数 b , d b, d b,d,求存在多少组正整数 a , b a, b a,b ,满足 a b + c d = b d \frac{a}{b} + \frac{c}{d} = \frac{b}{d} ba+dc=db
解题思路
式子变形得
a
=
b
(
b
−
c
)
d
a = \frac{b(b - c)}{d}
a=db(b−c) ,那么就是找有多少个可以正整数
c
c
c 的值,能让
a
a
a 也为正整数。
显然,
c
c
c 的取值范围为
(
0
,
b
)
(0, b)
(0,b) 之内的正整数。那么那些可以让右侧分式可以整除呢?我们可以先将
b
b
b 和
d
d
d 约分,得到
a
=
p
(
b
−
c
)
q
a = \frac{p(b - c)}{q}
a=qp(b−c) ,其中
p
,
q
p,q
p,q 互质。然后只有
b
−
c
b - c
b−c 是
q
q
q 的倍数时,才能让
a
a
a 是正整数
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
while(n --){
int b, d;
cin >> b >> d;
d /= __gcd(b, d);
cout << (b + d - 1) / d - 1 << '\n';
}
return 0;
}
注:如果想要求 ⌈ a b ⌉ \lceil \frac{a}{b} \rceil ⌈ba⌉,可以计算 ( a + b − 1 ) / b (a + b - 1) / b (a+b−1)/b