

Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll a1,b1,a2,b2; cin >> a1 >> b1 >> a2 >> b2;
if (a1 > b1) swap(a1, b1);
if (a2 > b2) swap(a2, b2);
ll g1 = __gcd(a1, b1);
ll g2 = __gcd(a2, b2);
a1 /= g1; b1 /= g1;
a2 /= g2; b2 /= g2;
if(a1 == a2 && b1 == b2) cout << "YES";
else cout << "NO";
}
Hãy giúp mọi người biết câu trả lời này thế nào?
![]()
Phân tích 1 chút:
`triangleA_1B_1C_1` vuông và `triangleA_2B_2C_2` vuông (giả sử tại `A_1 và A_2)
`=>triangleA_1B_1C_1`$\backsim$`triangleA_2B_2C_2 <=> [A_1B_1]/[A_1C_1]=[A_2B_2]/[A_2C_2]`
`<=>a_1/b_1=a_2/b_2<=>a_1b_2=a_2b_1`
Tuy nhiên với giới hạn `10^18` thì cần phân tích nhân tử tích của 2 cạnh để so sánh
#include <bits/stdc++.h>
using namespace std;
void fact(int x, vector<int> &a)
{
while (x % 2 == 0)
{
x /= 2;
a.push_back(2);
}
int i = 3;
while (i * i <= x)
{
while (x % i == 0)
{
x /= i;
a.push_back(i);
}
i += 2;
}
if (x > 1) a.push_back(i);
}
int main()
{
long long a1, b1, a2, b2;
cin >> a1 >> b1 >> a2 >> b2;
vector<int> a1b2, a2b1;
fact(a1, a1b2); fact(b1, a2b1);
fact(a2, a2b1); fact(b2, a1b2);
sort(a1b2.begin(), a1b2.end();
sort(a2b1.begin(), a2b1.end();
if (a1b2.size() != a2b1.size())
{
cout << "NO";
return 0;
}
for (int i = 0; i < a1b2.size(); ++i)
{
if (a1b2[i] != a2b1[i])
{
cout << "NO";
return 0;
}
}
cout << "YES";
}Hãy giúp mọi người biết câu trả lời này thế nào?
![]()
Bảng tin
59
2688
49
ừ ha quên mất vụ này :))
251
2366
186
:)