func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 1e5 + 10;   int a[maxn];   set<int> S;   long long qpow(long long a, long long b, long long mod) {     long long ret = 1LL;     while (b) {       if (b & 1) ret = ret * a % mod;       a = a * a % mod;       b >>= 1;     }     return ret;   }   long long inv(long long x, long long mod) { return qpow(x, mod - 2, mod); }   int main(void) {     int n, m;     scanf( %d %d , &m, &n);     if (n + n < m) {       for (int i = 1; i <= n; i++) scanf( %d , a + i), S.insert(a[i]);       if (n == 1) {         printf( %d 0 n , a[1]);         return 0;       }       int kd = (a[2] - a[1] + m) % m;       int cnt = 0;       for (int i = 1; i <= n; i++) {         int nxt = (a[i] + kd) % m;         if (S.find(nxt) != S.end()) cnt++;       }       int k = n - cnt;       if (!k) {         printf( %d %d n , a[1], kd);         return 0;       }       int d = (long long)kd * inv(k, m) % m;       cnt = 0;       for (int i = 0; i < n; i++)         if (S.find((a[1] - (long long)i * d % m + m) % m) != S.end()) cnt++;       if (cnt == n) {         printf( %I64d %d n , (a[1] - (long long)(n - 1) * d % m + m) % m, d);         return 0;       }       for (int i = 1; i < n; i++) {         if (S.find((a[1] + (long long)(i - n) * d % m + m) % m) != S.end()) cnt--;         if (S.find((a[1] + (long long)i * d % m + m) % m) != S.end()) cnt++;         if (cnt == n) {           printf( %I64d %d n , (a[1] + (long long)(i - n + 1) * d % m + m) % m,                  d);           return 0;         }       }       puts( -1 );     } else {       for (int i = 0; i < m; i++) S.insert(i);       for (int i = 1; i <= n; i++) scanf( %d , a + i), S.erase(a[i]);       n = m - n;       set<int>::iterator it = S.begin();       for (int i = 1; i <= n; i++) a[i] = *(it++);       if (n == 0) {         printf( 0 1 n );         return 0;       }       if (n == 1) {         printf( %d 1 n , (a[1] + n) % m);         return 0;       }       int kd = (a[2] - a[1] + m) % m;       int cnt = 0;       for (int i = 1; i <= n; i++) {         int nxt = (a[i] + kd) % m;         if (S.find(nxt) != S.end()) cnt++;       }       int k = n - cnt;       if (!k) {         printf( %d %d n , (a[1] + (long long)n * kd) % m, kd);         return 0;       }       int d = (long long)kd * inv(k, m) % m;       cnt = 0;       for (int i = 0; i < n; i++)         if (S.find((a[1] - (long long)i * d % m + m) % m) != S.end()) cnt++;       if (cnt == n) {         printf( %I64d %d n ,                (a[1] - (long long)(n - 1) * d % m + m + (long long)n * d) % m, d);         return 0;       }       for (int i = 1; i < n; i++) {         if (S.find((a[1] + (long long)(i - n) * d % m + m) % m) != S.end()) cnt--;         if (S.find((a[1] + (long long)i * d % m + m) % m) != S.end()) cnt++;         if (cnt == n) {           printf(                %I64d %d n ,               (a[1] + (long long)(i - n + 1) * d % m + m + (long long)n * d) % m,               d);           return 0;         }       }       puts( -1 );     }     return 0;   }   