B. Restore Modulo | Round #709 Div.2

LONGNEW·2021년 8월 12일
0

CP

목록 보기
79/155

https://codeforces.com/contest/1484/problem/B
시간 1초, 메모리 256MB

input :

  • t (1 ≤ t ≤ 105)
  • n (1 ≤ n ≤ 105)
  • a1, a2, …, an (0 ≤ ai ≤ 109 )

output :

  • For every array print:
    −1, if there are no such four numbers that generate this array;
    0, if m can be arbitrary large;
    the maximum value m and any appropriate c (0 ≤ c < m) in other cases.
    배열을 만들기 위한 4개의 숫자가 있을 수 없는 경우에는 -1을 출력, m의 크기가 무한대로 커질 수 있다면 0을 출력, 이 두 가지의 경우를 제외하고는 m, c를 출력합니다. 가장 큰 m과 적절한 c를 출력합니다.

조건 :

  • 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

일단 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)

0개의 댓글