luogu P2714 四元組統計

背景:

開始補坑。

題目傳送門:

https://www.luogu.org/problem/P2714

題意:

給一個序列,求滿足gcd(ai,aj,ak,al)=1\gcd(a_i,a_j,a_k,a_l)=1的四元組(i,j,k,l)(i,j,k,l)的個數。

思路:

你預處理出totxtot_x,即xx的倍數有多少個,這個你可以類似埃氏篩來做,時間複雜度:Θ(log)\Theta(值域\log 值域)
然後就是:luogu P5218\text{luogu P5218} 無聊的水題II\text{II}了。
顯然這一題中的FGCD=C(totGCD,4)F_{GCD}=C(tot_{GCD},4)。
貨真價實的大水題。

代碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
	int prime[10010],mu[10010],tot[10010];
	bool bz[10010];
	int n;
	LL ans;
void init(int ma)
{
	int t=0;
	bz[0]=bz[1]=true;
	mu[1]=1;
	for(int i=2;i<=ma;i++)
	{
		if(!bz[i]) prime[++t]=i,mu[i]=-1;
		for(int j=1;j<=t&&i*prime[j]<=ma;j++)
		{
			bz[i*prime[j]]=true;
			if(!(i%prime[j]))
			{
				mu[i*prime[j]]=0;
				break;
			}
			mu[i*prime[j]]=-mu[i];
		}
	}
}
LL C4(LL n)//C(n,4)
{
	return (n*(n-1)*(n-2)*(n-3))/(1*2*3*4);
}
int main()
{
	int T,x;
	init(10000);
	while(scanf("%d",&n)!=EOF)
	{
		memset(tot,0,sizeof(tot));
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			tot[x]++;
		}
		for(int i=1;i<=10000;i++)
			for(int j=(i<<1);j<=10000;j+=i)
				tot[i]+=tot[j];
		ans=0;
		for(int i=1;i<=10000;i++)
		{
			if(tot[i]<4||!mu[i]) continue;
			ans+=C4(tot[i])*mu[i];
		}
		printf("%lld\n",ans);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章