正题
题目链接:https://www.luogu.com.cn/problem/P2714
题目大意
给出nnn个数,求有多少个(i,j,k,l)(i,j,k,l)(i,j,k,l)使得gcd(ai,aj,ak,al)=1gcd(a_i,a_j,a_k,a_l)=1gcd(ai,aj,ak,al)=1。
解题思路
我们设fif_ifi表示gcdgcdgcd和为iii的方案数。FiF_iFi表示gcdgcdgcd和为iii的倍数的方案数。
先考虑如何统计FiF_iFi,其实就是选出444个iii的倍数的方案数,可以统计iii的倍数的个数即可计算。
然后有fi=Fi−∑i∣jfjf_i=F_i-\sum_{i|j}f_jfi=Fi−i∣j∑fj
时间复杂度O(Tnlogn)O(Tn\log n)O(Tnlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=11000;
ll n,f[N];
int main()
{while(scanf("%lld",&n)!=EOF){memset(f,0,sizeof(f));for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);f[x]++;}for(ll i=1;i<N;i++)for(ll j=i<<1;j<N;j+=i)f[i]+=f[j];for(ll i=N-1;i>=1;i--){f[i]=f[i]*(f[i]-1)*(f[i]-2)*(f[i]-3)/24;for(ll j=2*i;j<N;j+=i)f[i]-=f[j];}printf("%lld\n",f[1]);}
}