将原式两边同乘以 abxy ,得到:
(bx+ac)(by−cd)=−ac2d
然后枚举 ac2d 的所有因数并判断是否有正整数解。
#include <iostream>
#include <cmath>
#define int long long
using namespace std;
int t;
int a, b, c, d;
int ans;
const int N = 10000010;
int yz[N][2];
int get(int n) { //求所有因数
int tt = 0;
n = -n;
for(int i = 1; i <= sqrt(n); i++) {
if(n % i == 0) yz[++tt][0] = -i, yz[tt][1] = n / i, yz[++tt][0] = i, yz[tt][1] = -n / i;
}
return tt;
}
signed main() {
// freopen("song2.in", "r", stdin);
// freopen("song2.out", "w", stdout);
scanf("%lld", &t);
while(t--) {
scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
ans = 0;
int t = -a * c * c * d;
int tt = get(t);
for(int o = 1; o <= tt; o++) { //枚举所有因数
if((yz[o][0] - a * c) % b == 0 && (yz[o][1] + c * d) % b == 0 && (yz[o][0] - a * c) / b > 0 && (yz[o][0] + c * d) / b > 0) {
ans++;
}
if((yz[o][1] - a * c) % b == 0 && (yz[o][0] + c * d) % b == 0 && (yz[o][1] - a * c) / b > 0 && (yz[o][0] + c * d) / b > 0) {
ans++;
}
}
printf("%lld\n", ans);
}
return 0;
}