https://codeforces.com/contest/1484/problem/B
시간 1초, 메모리 256MB
input :
output :
조건 :
This generator takes four non-negative numbers n, m, c, s. n and m must be positive, s non-negative and for c it must be true that 0 ≤ c < m.
배열을 만드는 네개의 숫자를 n, m, c, s라고 한다. n과 m은 양수이고, s의 경우 음이 아닌 정수이며 c는 m보다 작고 0보다 크거나 같은 수이다.
a1 = s mod m, here x mod y denotes remainder of the division of x by y;
ai = (ai - 1 + c) mod m for all i such that 1 < i ≤ n
x mod y는 x를 y로 나눈 나머지를 뜻한다.
문제의 첫 예시를 본다면 접근을 어떻게 해야 하는지 감을 잡을 수 있다.
문제에서 원하는 것은 배열을 입력받고 그에 해당하는 m, c를 찾는 것이다.
문제의 기본 구성이 나머지를 통해 이루어진 배열이기 때문에 모든 원소들은 최소한 m보다 작아야 한다. 그런데 이를 충족하지 않는 경우에는 -1을 출력하면 되는 것이다.
일단 0의 경우를 생각해보자.
m이 무한대로 커지려면 일단 원소가 언제나 동일한 경우를 생각할 수 있다. 그 경우 c도 고정해서 만들 수 있기 때문에 0을 출력해야 한다.
그리고 원소가 1개만 있을 떄에도 그러하다.
가장 중요한 것은 어떻든 나머지를 생각한다는 것이다.
현재 원소 + c를 한 것이 m보다 커지게 되면 그 때 새로운 나머지를 얻는 것인데 이것에도 규칙이 발생한다. m보다 커지지 않은 경우에는 c만큼의 차이가 발생하고 커지는 경우에는 m - c만큼의 차이가 발생한다.
그러니까 모든 원소에 대해서 차이는 c, m - c만으로 구성되어야 하고 이 두 수를 더하면 m을 구할 수 있는 것이다.
커지는 것이 가능하다면 음수, 양수로 나뉘게 될 것이고. 이 음수가 c의 역할을 한다.
import sys
for _ in range(int(sys.stdin.readline())):
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
temp = set()
for i in range(1, len(data)):
temp.add(data[i - 1] - data[i])
if len(temp) == 1 or n == 1:
print(0)
elif len(temp) == 2:
a, b = sorted(temp)
if a < 0 and b > 0 and b - a > max(data):
print(b - a, -a)
else:
print(-1)
else:
print(-1)