码迷,mamicode.com
首页 > Windows程序 > 详细

Codeforces 839D Winter is here(容斥原理)

时间:2017-08-13 14:19:23      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:logs   span   amp   集合   --   ace   test   include   gcd   

 

【题目链接】 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(容斥原理)

标签:logs   span   amp   集合   --   ace   test   include   gcd   

原文地址:http://www.cnblogs.com/forever97/p/codeforces839d.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!