链接:CF839D

题目大意

给定一个数组大小为\(n(1\leq n\leq 200000)\)的数组\(a\),满足\(1\leq a_i \leq 1000000\)。

选择其中任意\(len\)个数字,若\(gcd>1\),则该组数字对答案贡献为\(len*gcd\),求最终答案对\(1e9+7\)取模。

题目分析

因为\(gcd\)的本质是因数分解,可以想到,如果不考虑算重,那么:

对于一个\(gcd\)的结果\(x\),若有\(num\)个数含有\(x\)这个因数,则被选择的数可形成的形如\(gcd(...)==x\)的贡献为:

\((1*C_{num}^1+2*C_{num}^2+3*C_{num}^3+......+num*C_{num}^{num})*x\)

其中,\(num\)可以直接枚举得到:

\(for(int\ i=x;i<=1000000;i+=x)num[x]+=cnt[i];\)

\(cnt[i]\)表示\(a[\ ]\)中大小为\(i\)的数字的个数,由于时间复杂度是调和级数,可以\(O(nlog(n))\)求解。

由公式可得:

\(1*C_{n}^1+2*C_{n}^2+3*C_{n}^3+......+n*C_{n}^{n}=n*2^{n-1}\)

此处可以\(O(1)\)求得答案,总时间复杂度为\(O(nlog(n))\)。


由于会有重复的情况,我们可以使用容斥去重。

对于每个数的容斥系数,可以附初值:\(tmp[i]=i;\)

由于每个数会在它的因数部分算重,可得:

\(tmp[x]=x- \sum\limits_{d|x}tmp[d];\)

\(tmp\)数组的计算也是调和级数,可以在\(O(nlog(n))\)求解。


综上:

\(ans+=num[x]*2^{num[x]-1}*x*tmp[x];\)

总时间复杂度\(O(nlog(n))\)。

代码实现

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=1000005,mod=1e9+7;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int tmp[N],prime[N];
bool vis[N];
void Pre(int n){
for(int i=2;i<=n;i++)tmp[i]=i;
for(int i=2;i<=n;i++){
if(!vis[i])prime[++prime[0]]=i,vis[i]=1;
for(int j=1;j<=prime[0]&&1ll*i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
for(int j=2;1ll*i*j<=n;j++)tmp[j*i]-=tmp[i];
}
}
LL ksm(LL x,LL k){
LL ret=1;
while(k){
if(k&1)ret=ret*x%mod;
x=x*x%mod;
k>>=1;
}
return ret;
}
int cnt[N];
int Query(int x){
int ret=0;
for(int i=x;i<=1000000;i+=x)ret+=cnt[i];
return ret;
}
int main(){
Pre(1000000);
int n=Getint();
for(int i=1;i<=n;i++)cnt[Getint()]++;
LL ans=0;
for(int i=2;i<=1000000;i++){
int x=Query(i);
if(!x)continue;
ans=(ans+x*ksm(2,x-1)%mod*tmp[i]%mod)%mod;
}
cout<<(ans+mod)%mod;
return 0;
}

Codeforces 839D Winter is here的更多相关文章

  1. CodeForces 839D - Winter is here | Codeforces Round #428 (Div. 2)

    赛后听 Forever97 讲的思路,强的一匹- - /* CodeForces 839D - Winter is here [ 数论,容斥 ] | Codeforces Round #428 (Di ...

  2. Codeforces 839D Winter is here - 暴力 - 容斥原理

    Winter is here at the North and the White Walkers are close. John Snow has an army consisting of n s ...

  3. Codeforces 839D Winter is here【数学:容斥原理】

    D. Winter is here time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...

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

    [题目链接] http://codeforces.com/contest/839/problem/D [题目大意] 给出一些数,求取出一些数,当他们的GCD大于0时,将数量乘GCD累加到答案上, 求累 ...

  5. codeforces 747D. Winter Is Coming(贪心)

    题目链接:http://codeforces.com/problemset/problem/747/D 题意:冬天有n天,冬天用的轮胎总共能用k天,一开始车子用的是夏天的轮胎. 给出n天的平均气温,温 ...

  6. CodeForces 747D Winter Is Coming

    贪心. 只考虑负数的位置,先填间隔较小的,再填间隔较大的.如果填不满就不填,如果有多余就留给最后一个负数到终点这段路. #include<cstdio> #include<cstri ...

  7. codeforce 839d.winter is here

    题意:如果一个子序列的GCD为1,那么这个子序列的价值为0,否则子序列价值为子序列长度*子序列GCD 给出n个数,求这n个数所有子序列的价值和 题解:首先得想到去处理量比较少的数据的贡献,这里处理每个 ...

  8. Codeforces Round #428 (Div. 2) D. Winter is here 容斥

    D. Winter is here 题目连接: http://codeforces.com/contest/839/problem/D Description Winter is here at th ...

  9. 【23.26%】【codeforces 747D】Winter Is Coming

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

随机推荐

  1. detours编译与windows下makefile学习

    1.编译 windows环境命令行编译很少用,detours需要使用命令行编译,刚好试试,过程如下: 1.为了能够在所有目录中使用nmake命令,需要设置环境变量Path D:\Program Fil ...

  2. c++ 11新特性学习1

    static_assert 静态断言,特点是编译期的断言检查 assert 运行时期的断言检查 二者参数用法相同

  3. C在结构体里面使用共用体

    在做链表的时候我们设计每个节点都是一个结构体,每个节点的数据用一个共用体表示,每创建malloc一个结构体节点我们也要相应的malloc共用体并把它付进去. 这是定义: typedef union E ...

  4. Java & 架构硬核福利,速度上车!

    极客时间福利时间! 最近,栈长每周都会给大家带来极客时间的专栏拼团优惠,给错过优惠的朋友一个再次优惠上车的机会. <从0开始学架构>和<Java核心技术36讲>,这两个专栏很火 ...

  5. SElinux(转)

    转自:http://www.361way.com/rh134-selinux/4653.html RH134小结(四)初识SElinux 2015年8月2日admin发表评论阅读评论   一.SEli ...

  6. python 15 文件操作(一)

    转自 http://www.cnblogs.com/BeginMan/p/3166644.html 一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python ...

  7. 以 Ubuntu 为例:清理 linux 系统的"垃圾"文件

    clean 命令删除所有的软件安装包. 在网络连接正常的情况下,我们执行软件安装命令,软件安装结束后,以 .deb 为后缀的软件包就不再需要了.这种情况和 Windows 平台.手机的安卓平台上的情况 ...

  8. x25, PF_X25 - ITU-T X.25 / ISO-8208 协议接口。

    总览 #include <sys/socket.h> #include <linux/x25.h> x25_socket = socket(PF_X25, SOCK_SEQPA ...

  9. PHP算法之增减字符串匹配

    给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length. 返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i ...

  10. luoguP3414 SAC#1 - 组合数

    题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数 ...