#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans;
int n,m;
int input[510];
int he[510];
int fa[510];
struct node{
int x,y,z;
}a[510];
inline bool cmp(node p,node q)
{
return p.z>q.z;
}
inline int find(int a)
{
if(a==fa[a]) return a;
return fa[a]=find(fa[a]);
}
inline void join(int a,int b)
{
a=find(a);
b=find(b);
if(a==b) return;
else{
if(he[a]==he[b]) he[b]++;
fa[a]=b;
}
return;
}
inline int ksm(int a,int b)
{
int s=1;
while(b>0){
if(b&1) s*=a,s%=m;
a*=a,a%=m;
b>>=1;
}
return s;
}
signed main(){
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> input[i];
fa[i]=i;
he[i]=0;
}
sort(input+1,input+n+1);
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(i!=j)
{
a[++cnt].x=i;
a[cnt].y=j;
a[cnt].z=(ksm(input[i],input[j])%m+ksm(input[j],input[i]))%m;
}
}
sort(a+1,a+cnt+1,cmp);
// for(int i=1;i<=cnt;i++)
// {
// cout << a[i].x << " " << a[i].y << " " << a[i].z << endl;
// }
int fj=0;
for(int i=1;i<=cnt;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
join(a[i].x,a[i].y);
ans+=a[i].z;
fj++;
}
if(fj==n-1)
{
cout << ans << endl;
return 0;
}
}
return 0;
}
萌新RE 求改(不知是哪里越界了)