아무래도이문제는A번난이도인것같다
백준 1402
SILVER V
문제 내용
문제 링크
해결 방안
문제의 내용을 정리하면, 정수 A를 임의의 정수들의 곱으로 나타낼 수 있다고 할 때, 그 정수들의 합이 B라면 A는 B로 변할 수 있다
라고 정의한다. 언뜻 보기에는 인수 분해를 통해 그 합을 구해야할 것 같지만, 중요한 것은 문제에서는 곱으로 나타내야 하는 정수의 어떠한 조건도 주어져 있지 않다는 것이다. 이 말은 즉슨, 정수의 범위나 정수의 개수, 정수의 중복 여부까지도 어떠한 제약이 없다는 것을 의미한다.
잘만 생각해본다면, 정수 n에 1을 무한정 곱해도 n이 나오지만 곱해지는 수들의 합은 무한히 늘어날 수 있다는 것을 눈치챌 수 있다. 다시 말해, 정수 A에 대해 (A < B)가 성립하면 A는 항상 B로 변할 수 있다. 물론, A나 B가 음수인 경우에도 대소관계만 성립하면 마찬가지이다.
반대로 A보다 B가 더 작은 경우에는 어떠한 경우가 성립하는 지 고려해야 한다. 결론부터 말하자면, 이 경우에는 -1 × -1 × 1
을 반복하여 곱하는 것으로 해결할 수 있다. 곱셈에 있어서는 (-1 × -1) × 1 = 1 × 1
이니 무한정 곱해도 수가 늘어나지 않지만, 덧셈에 있어서는 -1 + (-1 + 1) = -1 + 0
이니 -1씩 무한정 빼는 것이 가능해진다. 그래서 정수 A에 대해 (A > B)가 성립해도 A는 항상 B로 변할 수 있다.
위의 두 내용들을 정리하자면, (A < B)일 경우와 (A > B)일 경우 모두 A는 항상 B로 변할 수 있다. 당연하게도 (A = B)일 경우에는 무언가를 더 곱할 필요 없이 A = A
라는 식으로 표현하면 되므로, (A = B)일 경우에도 모두 A는 항상 B로 변할 수 있다. 즉, 정수 A에 있어 B의 값과 관계없이 A는 항상 B로 변할 수 있다.
풀이 코드
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
long a, b;
for(int i = 0; i < t; i++)
cin >> a >> b;
// A와 B의 값과 무관하게 항상 A는 B로 변할 수 있다.
for(int i = 0; i < t; i++)
cout << "yes\n";
return 0;
}