1 条题解
-
0
吃掉它。
两个球只能留一个。
那就是做 次。
看成有向边,那就是每条边的出度为 ,而且没有环。组合起来就是……树?
那不就是完全图求最小生成树吗?
#include<bits/stdc++.h> using namespace std; #define int long long const int N=510; struct node{int x,y,c;}e[N*N]; bool cmp(node n1,node n2){return n1.c>n2.c;} int c[N],P; int qpow(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P;return ans;} int fa[N]; int findfa(int x){return fa[x]==x?fa[x]:fa[x]=findfa(fa[x]);} signed main() { int n,len=0;cin>>n>>P; for(int i=1;i<=n;i++)cin>>c[i]; for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++) e[++len]={i,j,(qpow(c[i],c[j])+qpow(c[j],c[i]))%P}; sort(e+1,e+len+1,cmp); for(int i=1;i<=n;i++)fa[i]=i; int ans=0,sum=0; for(int i=1;i<=len;i++) { int tx=findfa(e[i].x),ty=findfa(e[i].y); if(tx!=ty) { fa[tx]=ty; ans+=e[i].c; sum++;if(sum==n-1)break; } } cout<<ans; return 0; }
- 1
信息
- ID
- 7020
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者