#include <bits/stdc++.h>
using namespace std;
long long rep(int m, int n, int x) {
  if (n == 0) return 1;
  long long tmp = rep(m, n >> 1, x);
  tmp *= tmp;
  tmp %= m;
  if (n & 1) {
    tmp *= x;
    tmp %= m;
  }
  return tmp;
}
long long arr[100010];
long long brr[100010];
long long lbound(long long *ary, int st, int ed, long long val) {
  int mid;
  while (st < ed) {
    mid = (st + ed) >> 1;
    if (ary[mid] >= val)
      ed = mid;
    else
      st = mid + 1;
  }
  return ary[st];
}
long long solv(int n, long long m, long long o[]) {
  if (n <= 1) return 1;
  int i, cnt = 0;
  long long d, tmp1;
  tmp1 = o[1] - o[0];
  for (i = 0; i < n; i++)
    if (lbound(o, 0, n, (o[i] + tmp1) % m) == (o[i] + tmp1) % m) cnt++;
  if (cnt > n) {
    printf("-1\n");
    return 0;
  }
  int k = n - cnt;
  if (k == 0) k = 1;
  d = tmp1 * rep((int)m, (int)m - 2, k);
  d %= m;
  return d;
}
int main() {
  int i;
  int n;
  int ans = 0;
  long long m, gap, tmp1;
  long long tt;
  scanf("%lld %d", &m, &n);
  for (i = 0; i < n; i++) scanf("%lld", &arr[i]);
  if (n == 1) {
    printf("%lld 1", arr[0]);
    return 0;
  }
  sort(arr, arr + n);
  if (n * 2 < m)
    gap = solv(n, m, arr);
  else {
    int pp = 0;
    for (i = 0; i <= m; i++) {
      if (lbound(arr, 0, n, i) == i) continue;
      brr[pp++] = i;
    }
    gap = solv(m - n, m, brr);
  }
  ans = 1;
  tt = arr[0];
  while (1) {
    tmp1 = tt + gap;
    if (tmp1 >= m) tmp1 -= m;
    if (lbound(arr, 0, n, tmp1) != tmp1) break;
    if (ans == n) break;
    ans++;
    tt = tmp1;
  }
  tt = arr[0];
  while (1) {
    tmp1 = tt - gap;
    if (tmp1 < 0) tmp1 += m;
    if (lbound(arr, 0, n, tmp1) != tmp1) break;
    if (ans == n) break;
    ans++;
    tt = tmp1;
  }
  if (ans == n)
    printf("%lld %lld\n", tt, gap);
  else
    printf("-1\n");
  return 0;
}
