背景:
開始補坑。
題目傳送門:
https://www.luogu.org/problem/P2714
題意:
給一個序列,求滿足的四元組的個數。
思路:
你預處理出,即的倍數有多少個,這個你可以類似埃氏篩來做,時間複雜度:。
然後就是: 無聊的水題了。
顯然這一題中的
貨真價實的大水題。
代碼:
#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);
}
}