牛客周賽 Round 50 D[小紅的因式分解] 超級無敵大暴力

lgdxxs12138發表於2024-07-08

牛客周賽 Round 50 D小紅的因式分解 超級無敵大暴力

首先拿到這個題,真的是一頭霧水,本蒟蒻今天才想出來。。。

首先拆開式子,我們可以得到a1a2 == a; a1b2+a2b1 == b;b1b2 == c;

那麼,我們只需要求解一對a1與b1即可得到本題答案,因為剩下的一對a2 b2由a/a1和b/b1得到

所以我們可以運用暴力,檢索a%a1 == 0的值並且在此時再去檢索c%b1 == 0如若滿足則輸出,無滿足就輸出NO即可。那麼我們真的要執行最差情況下高達2 x 10^6 x 2 x 10^6次數的這一坨嗎?

當然不!!!比如1000,對1000除以10得到的是1000,對1000除以100得到的是10,由基本數學知識可知,a1a2的位置是沒有要求的,b1b2同理,所以我們只需要對他開根,檢索其中一部分就好了,也就是對a1 b1暴力只檢索 -10^3 到 +10^3 即可

並且注意 0 不能做除數

程式碼如下

#include<iostream>
#include<iomanip> 
#include<cmath> 
#include<string> 
#include<algorithm>
using namespace std;
int main() {
	long long int T;
	cin >> T;
	while (T--) {
		int vis = -1;
		long long int a, b, c;
		cin >> a >> b >> c;
		for (long long i = -1000; i <= 1000; i++) {
			if (i == 0)
				continue;
			if(a%i == 0)
				for (long long j = -1000; j <= 1000; j++) {
					if (j == 0)
						continue;
					if (c % j == 0 && a * j / i + c * i / j == b) {
						vis = 1;
						cout << i << " " << j << ' ' << a / i << ' ' << c / j << endl;
						break;
					}
				}
			if (vis == 1)
				break;

		}
		if (vis != 1)
			cout << "NO" << endl;


	}

}

相關文章