D求调
  • 板块学术版
  • 楼主Luka__Modric
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/2/24 21:51
  • 上次更新2024/2/25 10:34:40
查看原帖
D求调
839893
Luka__Modric楼主2024/2/24 21:51
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,num[200010],ping[200010],s,zhi[200010],mu[200010],s1,ans,a[200010];
void zh(int bian){
	int x=bian;
	s1=0;
	for(int i=2;i*i<=x;i++){
		if(x%i==0){
			s1++;
			zhi[s1]=i;
			int tmp=0;
			mu[s1]=0;
			while(x%i==0){
				x/=i;
				mu[s1]++;
			}
		}
	}
	if(x!=1){
		s1++;
		mu[s1]=0;
		zhi[s1]=x;
		mu[s1]++;
	}
	int tmp=1,qwq=1;
	for(int i=1;i<=s1;i++){
		if(mu[i]%2){
			tmp*=zhi[i];
		}
	}
	qwq=tmp;
	if(tmp==1){
		for(int i=1;i<=s;i++){
			if(ping[i]==bian){
				ans+=(num[bian]-1)*num[bian];
			}
			else{
				ans+=num[bian]*num[ping[i]];
			}
		}
		return ;
	}
	while(1){
		if(tmp>200000)
			return ;
		for(int i=1;i<=s;i++){
			if(tmp*ping[i]>200000)
				break;
			if(tmp*ping[i]==bian)
				ans+=num[bian]*(num[bian]-1);
			else
				ans+=num[tmp*ping[i]]*num[bian];
		}
		tmp*=qwq*qwq;
		if(tmp>200000)
			return ;
	}
	return ;
}
signed main(){
	cin>>n;
	for(int i=1;i*i<=200000;i++)
		s++,ping[i]=i*i;
	for(int i=1;i<=n;i++){;
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		if(a[i]==0){
			ans+=(n-i);
			continue;
		}
		num[a[i]]++;
		zh(i);
	}
	cout<<ans;
}
2024/2/24 21:51
加载中...