背景:
开始补坑。
题目传送门:
https://www.luogu.org/problem/P2714
题意:
给一个序列,求满足
gcd
(
a
i
,
a
j
,
a
k
,
a
l
)
=
1
\gcd(a_i,a_j,a_k,a_l)=1
gcd(ai,aj,ak,al)=1的四元组
(
i
,
j
,
k
,
l
)
(i,j,k,l)
(i,j,k,l)的个数。
思路:
你预处理出
t
o
t
x
tot_x
totx,即
x
x
x的倍数有多少个,这个你可以类似埃氏筛来做,时间复杂度:
Θ
(
值
域
log
值
域
)
\Theta(值域\log 值域)
Θ(值域log值域)。
然后就是:
luogu P5218
\text{luogu P5218}
luogu P5218 无聊的水题
II
\text{II}
II了。
显然这一题中的
F
G
C
D
=
C
(
t
o
t
G
C
D
,
4
)
。
F_{GCD}=C(tot_{GCD},4)。
FGCD=C(totGCD,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);
}
}