오늘의 알고리즘

[C++] 백준 2981 검문

하늘하늘 . 2023. 2. 1. 21:40
#include <iostream>
#include <vector>
#include <algorithm>
 
int arr[101] = {};
int answer[101] = {};
 
int gcd(int a, int b)
{
	if (b == 0)
	{
		return a;
	}
 
	return gcd(b, a % b);
}
 
int main()
{
	int N = 0;
	std::cin >> N;
 
	for (int i = 0; i < N; ++i)
	{
		std::cin >> arr[i];
	}
 
	std::sort(arr, arr + N);
 
	int remainder = arr[1] - arr[0];
 
	for (int i = 2; i < N; ++i)
	{
		remainder = gcd(remainder, arr[i] - arr[i - 1]);
	}
 
	int count = 0;
	for (int i = 1; i * i <= remainder; ++i)
	{
		if (remainder % i == 0)
		{
			answer[count++] = i;
 
			if (i != remainder / i)
			{
				answer[count++] = remainder / i;
			}
		}
	}
 
	std::sort(answer, answer + count);
	for (int i = 1; i < count; ++i)
	{
		std::cout << answer[i] << " ";
	}
 
	return 0;
}
 

처음엔 arr[0]까지 계산하려고 했는데 그럼 너무 많은 크기가 있어 시간초과입니다.

arr에 모든 수를 M으로 나눠야 하고 M이 필요하기 때문에 서로 빼기만 한다면 나머지가 필요 없기 때문에

나눈다음 그 수의 최대 공약수를 구해놓는다면 최대공약수의 약수만큼 나옵니다. 

1은 필요없기 때문에 모두가 가지고 있는 약수이자 맨 처음나오는 수인 1을 빼고 제출합니다.