#include<bits/stdc++.h>#defineN505usingnamespace std;int mo, n, m, i, j, k, x, y, z, a[N], f[N];longlong s;structAB{int a, b, c;booloperator<(const AB &A)const{return c > A.c;}} d[N*N];intmi(longlong a,int b){int s=1, i;while(b){if(b&1) s = s * a % mo;
b /=2, a = a * a % mo;}return s;}intfind(int x){if(x == f[x])return x;return f[x]=find(f[x]);}intmain(){scanf("%d%d",&n,&mo);for(i=1; i<=n; i++){scanf("%d",&a[i]);for(j=1; j<i; j++){
d[++m].a = j, d[m].b = i;//统计任意两个的分数
d[m].c =(mi(a[j], a[i])+mi(a[i], a[j]))% mo;}}sort(d+1, d+m+1);//不能有环取最大生成树for(i=1; i<=n; i++) f[i]= i;for(i=1; i<=m; i++){
x =find(d[i].a), y =find(d[i].b);if(x == y)continue;
s += d[i].c, f[x]= y;if(++z == n-1)break;}printf("%lld\n", s);return0;}