Wa on#3 #17求hack
查看原帖
Wa on#3 #17求hack
602372
Brilliant11001楼主2023/11/4 15:51

思路:

将原式两边同乘以 abxyabxy ,得到:

(bx+ac)(by−cd)=−ac2d(bx + ac)(by - cd) = -ac^2d

然后枚举 ac2dac^2d 的所有因数并判断是否有正整数解。

#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;
}
2023/11/4 15:51
加载中...