Codeforces 839D Winter is here(容斥原理)
Posted forever97‘s blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 839D Winter is here(容斥原理)相关的知识,希望对你有一定的参考价值。
【题目链接】 http://codeforces.com/contest/839/problem/D
【题目大意】
给出一些数,求取出一些数,当他们的GCD大于0时,将数量乘GCD累加到答案上,
求累加和。
【题解】
我们枚举GCD,统计为其倍数的数字数量,先假定其能组成的集合数为贡献,
但是我们发现在统计的过程中有多余统计的部分,比如4和8是2的倍数,
然而它们的GCD等于4,所以我们对于每个集合数的贡献要减去所有其倍数的集合数的贡献,
倒着容斥即可。
【代码】
#include <cstdio> #include <algorithm> using namespace std; const int N=1000010,MOD=1e9+7; int n,ans=0,w[N],dp[N],pw[N],mx; int main(){ scanf("%d",&n); for(int i=pw[0]=1;i<=n;i++)pw[i]=2*pw[i-1]%MOD; for(int i=1,x;i<=n;i++)scanf("%d",&x),mx=max(x,mx),w[x]++; for(int i=mx;i>1;i--){ int t=0; for(int j=i;j<=mx;j+=i)t+=w[j]; if(!t)continue; dp[i]=1LL*t*pw[t-1]%MOD; for(int j=i+i;j<=mx;j+=i)dp[i]=(dp[i]-dp[j]+MOD)%MOD; ans=(1LL*dp[i]*i+ans)%MOD; }printf("%d\n",ans); return 0; }
以上是关于Codeforces 839D Winter is here(容斥原理)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 747D Winter Is Coming
(容斥)Codeforces Round #428 (Div. 2) D. Winter is here
Codeforces 747D:Winter Is Coming(贪心)
Codeforces Round #428 (Div. 2) D. Winter is here[数论II][容斥原理]