- 题解
取球得分树
- @ 2026-8-3 18:27:30
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e6+10;
struct node {
int u,v;
ll w;
} e[maxn];
ll a[maxn];
ll mod;
int fa[maxn];
int n,m;
ll ans;
bool cmp(node a,node b) {
return a.w>b.w;
}
int find(int x) {
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
ll kruskal() {
sort(e+1,e+1+m,cmp);
for(int i=1; i<=m; i++) {
int u=find(e[i].u);
int v=find(e[i].v);
if(u==v) continue;
ans+=e[i].w;
fa[u]=v;
}
return ans;
}
ll qpow(ll s,ll k) {
ll res=1;
while(k>0) {
if(k&1) res=res*s%mod;
s=s*s%mod;
k/=2;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>mod;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++) fa[i]=i;
for(int i=1; i<n; i++) {
for(int j=i+1; j<=n; j++) {
e[++m].u=i;
e[m].v=j;
e[m].w=(qpow(a[i],a[j])+qpow(a[j],a[i]))%mod;
}
}
cout<<kruskal();
return 0;
}
0 条评论
目前还没有评论...