莫比乌斯函数,把所有的是i的倍数的数;num[i]如果大于四个就用C(4,num[i])*mu[i]就是答案
#include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
using namespace std;
const int MAX=11000;
int mu[MAX],n,max1;
int cnt[MAX];
int num[MAX];
void init()
{
memset(mu,0,sizeof(mu));
mu[1]=1;
for(int i=1;i<MAX-10;i++)
for(int j=i+i;j<MAX-10;j+=i)
mu[j]-=mu[i];
}
long long solve()
{
for(int i = 1; i <= max1; i++)
for(int j = i; j <= max1; j += i)
num[i] += cnt[j];
ll ans = 0;
for(int i = 1; i <= max1; i++)
{
int x = num[i];
if(x >= 4)
ans += (ll) mu[i] * x * (x - 1) * (x - 2) * (x - 3) / 24;
}
return ans;
}
int main()
{
init();
while(~scanf("%d",&n))
{
max1=0;
memset(cnt,0,sizeof(cnt));
memset(num, 0, sizeof(num));
for(int i = 0; i < n; i++)
{
int tmp;
scanf("%d", &tmp);
cnt[tmp] ++;
max1 = max(max1, tmp);
}
if(n<4)printf("0\n");
else printf("%lld\n",solve());
}
return 0;
}