哪位大神帮本蒟蒻改改代码?
查看原帖
哪位大神帮本蒟蒻改改代码?
1283888
zhuxuanze楼主2024/7/16 20:38
#include <bits/stdc++.h> 
using namespace std; 
int k,m,a[510],fa[510],cnt=0;
long long int ans=0;
struct node{
	int x,y,z;
}n[251000];
long long int power(int a,int b,int p)
{
	long long int ans=1;
	while(b)
	{
		if(b&1)
			ans=ans*a%p;
		a=a*a%p;
		b=(b>>1);
	}
	return ans;
}
int find(int x)
{
	if(x!=fa[x]) fa[x]=find(fa[x]);
	return fa[x];
}
void merge(int x,int y)
{
	fa[find(y)]=find(x);
}
bool cmp(node x,node y)
{
	return x.z>y.z;
}
int main()
{
	scanf("%d%d",&k,&m);
	for(int i=1;i<=k;i++)
		fa[i]=i;
	for(int i=1;i<=k;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=k;i++)
		for(int j=i+1;j<=k;j++)
		{
			n[++cnt].x=i;
			n[cnt].y=j;
			n[cnt].z=(power(a[i],a[j],m)+power(a[j],a[i],m))%m;
		}
	sort(n+1,n+cnt+1,cmp);
	int f=0;
	for(int i=1;i<=cnt;i++)
	{
		if(find(n[i].x)!=find(n[i].y))
		{
			merge(n[i].x,n[i].y);
			ans+=n[i].z;
			f++;
		}
		if(f==k-1)
		{
			printf("%lld",ans);
			return 0;
		}
	}
}
2024/7/16 20:38
加载中...