https://www.acmicpc.net/problem/26073

 

26073번: 외로운 곰곰이는 친구가 있어요

첫 번째 줄에 친구의 수 $N\ (1 \le N \le 10\,000)$이 주어집니다. 이후 $N$개의 친구 정보가 각각 두 줄에 걸쳐 주어집니다. $i$번째 친구 정보의 첫 번째 줄에는 친구의 처음 위치 $X_i$, $Y_i\ (-100\,000 \le X

www.acmicpc.net

 

풀이 

더보기

0. 문제를풀기 앞서서 풀어야되는 문제 및 알아야 되는 정리

https://www.acmicpc.net/problem/9613

 

9613번: GCD 합

첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진

www.acmicpc.net

GCD를 구하는 법을 알아봅시다.

 

https://namu.wiki/w/%EB%B2%A0%EC%A3%BC%20%ED%95%AD%EB%93%B1%EC%8B%9D#fn-1

 

베주 항등식 - 나무위키

베주 항등식(Bézout's Identity)은 두 정수와 그 최대공약수 사이의 관계를 보여주는 항등식이다. 그 내용은 다음과 같다. 적어도 둘 중 하나는 0이 아닌 정수 a,ba, ba,b가 있다. 그리고 aaa와 bbb의 최대

namu.wiki

베주 항등식을 모르면 풀수없습니다. 공부합시다.

 

 

1. 핵심 아이디어

 

베주 항등식이란 다음과 같습니다.

적어도 둘 중 하나는 0이 아닌 정수 a가 있다. 그리고 a b의 최대공약수를 d라고 하자.
이때, 다음 세 명제가 성립한다.
1. d=  를 만족하는 정수 x, y가 반드시 존재한다.
2. d는 정수 x, y에 대하여 ax+by 형태로 표현할 수 있는 가장 작은 자연수이다.
3. 정수 x 에 대하여 ax+by 형태로 표현되는 모든 정수는 의 배수이다.

 

이를 확장해서 생각하면 다음과 같이 정의할수도 있습니다.

적어도 둘 중 하나는 0이 아닌 정수들 A1~An가 있다. 그리고 A1~An의 최대공약수를 d라고 하자.
이때, 다음 세 명제가 성립한다.
1. 가 반드시 존재한다.
2. d는 정수 (A1B1+ ... +AnBn) 형태로 표현할 수 있는 가장 작은 자연수이다.
3. 정수 B1~Bn에 대하여 (A1B1+ ... +AnBn) 형태로 표현되는 모든 정수는 의 배수이다.

 

즉 입력으로 주어지는 숫자들의 최대공약수(d)는 움직일수 있는 거리의 최소단위라는 뜻이다.

GCD를 사용해서 d를 구하고

X와 Y가 d로 나누어떨어진다면 Ta-da 아니라면 Gave up을 출력하면된다.

코드

더보기
#include <bits/stdc++.h>

#pragma warning(disable:4996)

using namespace std;

#define endl "\n"
#define int long long
#define float long double

const float INF = 1e10;
const int Dic[8][2] = { {0,1},{0,-1},{1,0},{-1,0} ,{1,1},{-1,-1},{1,-1},{-1,1} };

//////////////////////////////////////////////////////////////////////// 

int GCD(int pA, int pB)
{
	if (pB == 0) 
		return pA;
	else return GCD(pB, pA % pB);
}

int N;


int32_t main()
{
	ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	std::cin >> N;
	while(N--)
	{
		int X, Y;
		std::cin >> X >> Y;
		int K;
		std::cin >> K;
		vector<int> A(K);
		for (int i = 0; i < K; i++)
		{
			std::cin >> A[i];
		}

		int v = A[0];
		for (int i = 1; i < K; i++)
		{
			v = GCD(v, A[i]);
		}

		if (X % v == 0 && Y % v == 0)
		{
			std::cout << "Ta-da" << endl;
		}
		else
		{
			std::cout << "Gave up" << endl;
		}
	}
}

 

출처 : 나무위키

'알고리즘 > 문제풀이' 카테고리의 다른 글

백준 25051 천체 관측  (1) 2023.01.05
백준 24425 タクシー 2 (Taxis 2)  (0) 2022.12.28
백준 26076 곰곰이의 식단 관리 2  (0) 2022.11.28
백준 15997 승부 예측  (0) 2022.11.27
백준 26009 험난한 등굣길  (0) 2022.11.26

+ Recent posts