题意:给定一个数列${a_i}$,若子序列长度为$k$,最大公约数为$gcd$,定义子序列的权值为$k*\gcd (\gcd  > 1)$。求所有子序列的权值和。 答案对10^9+7取模。

解题关键:容斥原理求序列中各$gcd$的个数,亦可用莫比乌斯函数。

逆序求的话,前面直接减后面的个数,在后面一项就相当于相加了,如此往复。

关于知道所有$gcd$为$n$的个数之后答案的求法:

法一:

$\begin{array}{l}
1C_n^1 + 2C_n^2 + ... + nC_n^n\\
= n(C_{n - 1}^1 + C_{n - 1}^2 + ... + C_{n - 1}^{n - 1})\\
= n{2^{n - 1}}
\end{array}$

法二:

$\begin{array}{l}
[{(x + 1)^n}]' = n{(x + 1)^{n - 1}}\\
{(x + 1)^n} = \sum\limits_{i = 1}^n {C_n^i{x^i}} \\
n{(x + 1)^{n - 1}} = \sum\limits_{i = 1}^n {C_n^ii{x^{i - 1}}}
\end{array}$

法三:逆序相加

容斥解法:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+;
#define inf 0x3f3f3f3f
ll c[],pw[],sum[];
int main(){
ll n,x,mx=-inf;
cin>>n;
pw[]=;
for(int i=;i<=n+;i++) pw[i]=pw[i-]*%mod;
for(int i=;i<n;i++) cin>>x,c[x]++,mx=max(mx,x);//hash一下
ll ct;
ll ans=;
for(int i=mx;i>;i--){
ct=;
for(int j=i;j<=mx;j+=i){
ct=(ct+c[j])%mod;
sum[i]-=sum[j];
}
sum[i]=(sum[i]+ct*pw[ct-]%mod+mod)%mod;
ans=(ans+sum[i]*i%mod+mod)%mod;
}
cout<<ans<<"\n";
return ;
}

莫比乌斯反演解法:

 #include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod=1e9+;
ll mu[],c[],cnt[],pw[],g[];
void sievemu(int n){
mu[]=;
for(int i=;i<=n;i++){
for(int j=i+i;j<=n;j+=i){
mu[j]-=mu[i];
}
}
} int main(){
sievemu();
ll n,x,mx=-inf;
cin>>n;
pw[]=;
for(int i=;i<=n;i++) pw[i]=pw[i-]*%mod;
for(int i=;i<n;i++) cin>>x,c[x]++,mx=max(mx,x);
for(int i=;i<=mx;i++){
ll ss=;
for(int j=i;j<=mx;j+=i){
ss+=c[j];
}
if(ss) cnt[i]=ss*pw[ss-]%mod;
}
//计算gcd倍数的个数 //对答案进行莫比乌斯反演
ll ans=;
for(int i=;i<=mx;i++){
for(int j=i;j<=mx;j+=i){
g[i]=(g[i]+cnt[j]*mu[j/i]%mod+mod)%mod;
}
ans=(ans+i*g[i]%mod+mod)%mod;
}
cout<<ans<<"\n";
return ;
}

[cf839d]Winter is here容斥原理的更多相关文章

  1. CF839D Winter is here

    题目分析 显然我们不可能直接计算每一个子序列的贡献,而应该计算对于每一个gcd对答案的贡献. 考虑容斥.按照套路: 设\(q(i)\)表示序列\(gcd\)为\(i\)的倍数的序列长度和. 设\(g( ...

  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 Round #428 (Div. 2) D. Winter is here

    给你一个序列,让你对于所有gcd不为1的子序列,计算它们的gcd*其元素个数之和. 设sum(i)为i的倍数的数的个数,可以通过容斥算出来. 具体看这个吧:http://blog.csdn.net/j ...

  6. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  7. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  8. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  9. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

随机推荐

  1. ThinkPHP 3.2.2 事务

    手册里说得非常清楚 : 5.3.19 事务支持 ThinkPHP提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法: 启动事务: PHP代码 $User->startTra ...

  2. js原生函数一些封装

    这是一些js原生封装的函数,主要是为了兼容IE浏览器,如下 获取css样式 function getStyle(ele, prop) { if(window.getComputedStyle) { r ...

  3. 使用Pydoc生成文档

    Python中本身带有很多实用的工具,如pydoc.pydoc模块主要用来从Python模块中提取信息并生成文档. 使用方法 在Windows和Linux下的使用方法有些区别. Windows pyt ...

  4. php使用mysql数据库时中文不显示或显示异常解决方法

    如果出现标题所述问题,需从四个层面解决问题 1 项目文件是否为utf8编码 右键项目文件->properties->Resource->Text file encoding-> ...

  5. Spring 相关

    1. spring的bean的scope属性范围  参考:http://jiangshuiy.iteye.com/blog/1667316 原理分析(bean的scope属性范围) scope用来声明 ...

  6. 关于mysql使用索引的一个问题

    mysql一直号称是免维护的,但是我发现它往往连最表基本索引都不能自动维护,情景如下: 1.我用mysqldump导出一个大表longformh; 2.用mysql.exe导入到一个新库中: 3.查看 ...

  7. Javascript 模块化编程 --RequireJs

    什么是模块化 模块就是实现特定功能的一组方法,常见的几种js写法 原始写法 function A() { } function B() { } 上面函数A()和B()组成一个模块,使用的时候直接调用就 ...

  8. python3 字符串属性(三)

    maketrans 和 translate的用法(配合使用) 下面是python的英文用法解释 maketrans(x, y=None, z=None, /) Return a translation ...

  9. 创建第一个Servlet并定制Sevlet模板

    我们已经为eclipse配好了Tomcat服务器,创建了Web工程,现在是时候该创建一个Servlet向世界问好了! 第一步:创建一个Web工程,选中”src“文件夹 -->单击右键,鼠标移到” ...

  10. Java_util_02_Java判断字符串是中文还是英文

    做微信开发,使用百度翻译API时,需要指定译文的语种.这就需要我们判断待翻译内容是中文还是英文,若是中文,则翻译成英文,若是英文则翻译成中文. 方法一:字符与字节的长度 依据:一个中文占两个字节,一个 ...