牛客周賽 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;
}
}