#include #include #include const int maxm = 10000000; int frac[maxm]; int main() { int n, m; assert(scanf("%d%d", &n, &m) == 2 && 1 <= n && n <= 100000 && 1 <= m && m <= 10000000); frac[0] = 1 % m; for (int i = 1; i < m; ++ i) { frac[i] = (long long)frac[i - 1] * i % m; } int answer = 0; for (int i = 0; i < n; ++ i) { long long x; assert(scanf("%lld", &x) == 1 && 1 <= x && x <= 1000000000000000000LL); int part1 = 0; if (x + 1 < m) { part1 = frac[x + 1]; } long long y = x; long long z = x + 1; if (y % 2 == 0) { y /= 2; } else { z /= 2; } int part2 = (x % m) * ((y % m) * (z % m) % m) % m; int current = (part1 + part2 + m - 1) % m; answer = (answer + current) % m; } printf("%d\n", answer); return 0; }