1 条题解

  • 0
    @ 2026-7-3 21:49:08

    吃掉它。

    两个球只能留一个。

    那就是做 N1N-1 次。

    看成有向边,那就是每条边的出度为 11,而且没有环。组合起来就是……树?

    那不就是完全图求最小生成树吗?

    #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
    上传者