WA on#11求助
  • 板块CF60D Savior
  • 楼主黑影洞人
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/13 13:38
  • 上次更新2023/10/27 03:07:20
查看原帖
WA on#11求助
285617
黑影洞人楼主2022/11/13 13:38
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#define N 10000007
#define int long long
using namespace std;
int f[N],mx,ans,a[N];
int n;
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void merge(int x,int y){
	//printf("%lld %lld\n",x,y);
	int u=x,v=y;
	x=find(x),y=find(y);
	if(x==y)return;
	if(!x||!y)return;
	printf("%lld %lld\n",u,v);
	f[x]=y;ans--;
}
map<long long,bool>mp;
signed main(){
	scanf("%lld",&n);ans=n;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		mx=max(mx,a[i]);
		mp[a[i]]=1;
		f[a[i]]=a[i];
	}
	for(int i=1;i<=min((int)1e14,mx*mx);i+=2*sqrt(i)+1){
		for(int j=1;j<=n;j++){
			double chk=sqrt(i+a[j]*a[j]);
			int now=sqrt(i+a[j]*a[j]);
			if(chk!=now)continue;
			if(now==0)continue;
			if(now==i)continue;
			if(now==a[j])continue;
			if(i==a[j])continue;
			if(__gcd(a[j],now)==1&&__gcd(i,a[j])==1&&__gcd(now,i)==1&&mp.find(now)!=mp.end())merge(a[j],now);
		}
	}
	for(int i=1;i<=min((int)1e14,mx*mx);i+=2*sqrt(i)+1){
		for(int j=1;j<=n;j++){
			double chk=sqrt(i+a[j]*a[j]);
			int now=sqrt(i+a[j]*a[j]);
			if(chk!=now)continue;
			//printf("%lld %lld %lld\n",i,now,a[j]);
			if(now==0)continue;
			if(now==i)continue;
			if(now==a[j])continue;
			if(i==a[j])continue;
			if(__gcd(a[j],now)==1&&__gcd(i,a[j])==1&&__gcd(now,i)==1&&mp.find(now)!=mp.end())merge(a[j],now);
		}
	}
	printf("%lld",ans);
	return 0;
}



2022/11/13 13:38
加载中...