https://www.acmicpc.net/problem/27295 실버 5
Baekjoon Online JudgeBaekjoon Online Judgewww.acmicpc.net죄다 lld로 바꿨는데도 틀리는 걸 보면 논리가 틀린 것 같은데 제 머리로는 안됩니다
#include <iostream>
using namespace std;
long long getGCD(long long a, long long b)
{
if (b == 0) return a;
return getGCD(b, a % b);
}
int main(void)
{
long long n = 0, b = 0, sum_x = 0, sum_y = 0;
cin >> n >> b;
while(n--)
{
long long x = 0, y = 0;
cin >> x >> y;
sum_x += x;
sum_y += b - y;
} // Σ(ax + b - y) = 0 --> a * sum_x + sum_y = 0
sum_y *= -1; // a * sum_x = - sum_y --> a = - sum_y / sum_x
if(sum_x == 0) // a * 0 + sum_y = sum_y 따라서 가능한 a는 어떤 수든 가능
{
cout << "EZPZ";
}
else if(sum_y % sum_x == 0) // 정수로 나오는 출력
{
cout << sum_y / sum_x;
}
else // 분수로 나오는 출력
{
bool minus = (sum_x * sum_y < 0); // 곱해서(나눠서) 음수인 경우 확인
if(sum_x < 0) sum_x *= -1;
if(sum_y < 0) sum_y *= -1;
long long gcd = getGCD(sum_x, sum_y);
if (minus) // sum_y/sum_x 출력할 때 sum_y에 - 붙이기 위해서
{
cout << -sum_y / gcd << '/' << sum_x / gcd;
}
else
{
cout << sum_y / gcd << '/' << sum_x / gcd;
}
}
}
1 0 -2 -1 이거 답 1/2 인데 -1/2 으로 나옴 sum_x, sum_y 정리해서 나온게 둘 다 음수고 분수로 표현할 때가 문제인거 같아
감사합니다그 부분만 다음과 고쳤는데도 틀리네요...bool minus = (sum_x * sum_y < 0);if(sum_x < 0) sum_x *= -1;if(sum_y < 0) sum_y *= -1;long long gcd = getGCD(sum_x, sum_y);if (minus){ cout << -sum_y / gcd << '/' << sum_x / gcd;}else{ cout << sum_y / gcd << '/' << sum_x / gcd;}
본문으로 수정했습니다
bool minus = (sum_x * sum_y < 0) 여기서 sum_x * sum_y가 long long 범위 넘어감
정말 감사드립니다!!! 더 열심히 공부해야겠습니다...