CF585E. Present for Vitalik the Philatelist [容斥原理 !]
CF585E. Present for Vitalik the Philatelist
题意:\(n \le 5*10^5\) 数列 \(2 \le a_i \le 10^7\),对于每个数\(a\)满足\(gcd(S)=1,\ gcd(S,a) \neq 1\)的集合称为\(MeowS\),求\(MeowS\)的个数和
一开始想对于每个数求出有多少个数和它互质,就是没有公因子,容斥一下就是:
所有数-1个公质因子+2个不同公质因子-3...
每个数不同的质因子最多有8个,预处理一下貌似可做
然后看到了zyf2000的神做法,并没有看明白是什么意思,感觉说错了但是做法是对的
然后花了两节课来想为什么,终于想明白了
首先了解一下官方题解的做法:
- 用容斥求\(gcd\neq 1\)的集合数,就是: $$A = (p_i\mid gcd的子集个数)\ -\ (p_ip_j \mid gcd的子集个数)\ +\ (p_ip_jp_k \mid gcd的子集个数)...$$
- 然后对于每个数\(a\)在\(A\)中消去包含它的集合的贡献再计入答案,通过枚举它的不同质因子的组合\(p...\),在上式中消去这个组合的贡献
看起来好复杂...并且枚举还是\(2^8\)
如何简化这个过程?
我们没有必要求每个数,整体考虑
设质数组合\(p...\)的倍数有\(c\)个,那么它的贡献就是\(2^c-1\),有多少个数计算的时候没有消去这个贡献呢,\(n-c\)个呀,就是没有这个组合的数!
计算\(A\)的时候直接乘上这个就行了
然后就得到zyf2000的神做法了...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=5e5+5, M=1e7+5, P=1e9+7;
typedef long long ll;
inline ll read(){
char c=getchar();ll x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n, a, m, mi[N];
int notp[M], p[M], mu[M], c[M];
void sieve(int n) {
mu[1] = 1;
for(int i=2; i<=n; i++) {
if(!notp[i]) p[++p[0]]=i, mu[i]=-1;
for(int j=1; j<=p[0] && i*p[j]<=n; j++) {
notp[i*p[j]] = 1;
if(i%p[j] == 0) {mu[i*p[j]]=0; break;}
mu[i*p[j]] = -mu[i];
}
}
}
ll ans=0;
int main() {
//freopen("in","r",stdin);
n=read(); mi[0]=1;
for(int i=1; i<=n; i++) a=read(), m=max(m, a), c[a]++, mi[i]=(mi[i-1]<<1)%P;
sieve(m);
for(int i=1; i<=m; i++) {
int tot=0;
for(int j=i; j<=m; j+=i) tot += c[j];
(ans += (ll) (n-tot) * (-mu[i]) * (mi[tot]-1) %P )%=P;
}
cout << (ans+P)%P;
}
CF585E. Present for Vitalik the Philatelist [容斥原理 !]的更多相关文章
- 「CF585E」 Present for Vitalik the Philatelist
「CF585E」 Present for Vitalik the Philatelist 传送门 我们可以考虑枚举 \(S'=S\cup\{x\}\),那么显然有 \(\gcd\{S'\}=1\). ...
- 【CodeForces】585 E. Present for Vitalik the Philatelist
[题目]E. Present for Vitalik the Philatelist [题意]给定n个数字,定义一种合法方案为选择一个数字Aa,选择另外一些数字Abi,令g=gcd(Ab1...Abx ...
- 【CF 585E】 E. Present for Vitalik the Philatelist
E. Present for Vitalik the Philatelist time limit per test 5 seconds memory limit per test 256 megab ...
- CF 585 E Present for Vitalik the Philatelist
CF 585 E Present for Vitalik the Philatelist 我们假设 $ f(x) $ 表示与 $ x $ 互质的数的个数,$ s(x) $ 为 gcd 为 $ x $ ...
- CF585E:Present for Vitalik the Philatelist
n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数. 好的统计题. 其实就 ...
- Codeforces 585E. Present for Vitalik the Philatelist(容斥)
好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...
- E. Present for Vitalik the Philatelist 反演+容斥
题意:给n个数\(a_i\),求选一个数x和一个集合S不重合,gcd(S)!=1,gcd(S,x)==1的方案数. 题解:\(ans=\sum_{i=2}^nf_ig_i\),\(f_i\)是数组中和 ...
- Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)
Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的 D1E 罢--虽然我不会做/kk u1s1 似乎这场 Div1 挺水的?F 就是个 AC 自动机板子还被评到了 3k2-- ...
- CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为\(n\)的可重集\(T\),求有多少个它的非空子集\(S\)和元素\(x\)满 ...
随机推荐
- oracle分页查询及原理分析(总结)
oracle分页查询及原理分析(总结) oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询 ...
- VS2008 如何将Release版本设置可以调试的DEBUG版本
VS2008 如何将Release版本设置可以调试的DEBUG版本 只需设置三个部分: 项目->属性->C/C++->General->Debug Information Fo ...
- Oracle_多行函数
Oracle_多行函数 多行函数min(),max(),count(),sum(),avg() --1.1统计公司的最高工资,最低工资和总人数 --对于null值直接略过,不做运算 --max ...
- Spark高可用集群搭建
Spark高可用集群搭建 node1 node2 node3 1.node1修改spark-env.sh,注释掉hadoop(就不用开启Hadoop集群了),添加如下语句 export ...
- 本地phpstudy开发中apache可以用,nginx不可用,
倒腾半天,在控制面板中,windows防火墙中关闭防火墙即可, http://blog.csdn.net/vic0228/article/details/70756450
- Web前端学习(1):上网的过程与网页的本质
"众里寻他千百度"--但是在信息化时代,我们只需要动动手指百度一下,google一下,便可以在网络上寻得我们想要查找的信息.我们或许都知道要如何在网上获得自己所需信息,但是上网的过 ...
- Java面试经
最近趁有空整理下面试经常会被问到的知识点,参考的资料都是本人通过百度而挑选出来的,具有一定的参考意义. 一 .java基础1.String和StringBuffer.StringBuild的区别:ht ...
- Pandas(python)数据处理:只对某一列DataFrame数据进行归一化
处理数据要用到Pandas,但是没有学过,不知道是否有直接对某一列归一化的方法调用.自己倒弄了下.感觉还是比较麻烦. 使用Pandas读取到数组之后想把其中的'MonthlyIncome'一列进行归一 ...
- 解决 PHPExcel 长数字串显示为科学计数[转]
解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...
- sass和compass实战 读书笔记(一)
sass优势: 不做重复的工作 一 消除样式表冗余(通过变量赋值的方式) 1. 通过变量来复用属性值 2. 使用嵌套来快速写出多层级的选择器 3. 通过混合器来复用一段样式 4. 使用选择器继承来避 ...