P2714-四元组统计【数论,容斥】
生活随笔
收集整理的这篇文章主要介绍了
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,其实就是选出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]);} }总结
以上是生活随笔为你收集整理的P2714-四元组统计【数论,容斥】的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 联想笔记本电脑的配置从哪里看(联想笔记本
- 下一篇: P3287-[SCOI2014]方伯伯的