欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

P2714-四元组统计【数论,容斥】

发布时间:2023/12/3 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 P2714-四元组统计【数论,容斥】 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

正题

题目链接: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,其实就是选出444iii的倍数的方案数,可以统计iii的倍数的个数即可计算。

然后有fi=Fi−∑i∣jfjf_i=F_i-\sum_{i|j}f_jfi=Fiijfj

时间复杂度O(Tnlog⁡n)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]);} }

总结

以上是生活随笔为你收集整理的P2714-四元组统计【数论,容斥】的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。