正题

题目链接:https://www.luogu.com.cn/problem/CF585E


题目大意

给出一个大小为\(n\)的可重集\(T\),求有多少个它的非空子集\(S\)和元素\(x\)满足

\(x\notin S,gcd\{S\}>1,gcd(S,x)=1\)

\(1\leq n\leq 5\times 10^5\),值域范围是\([2,10^7]\)


解题思路

\(x\notin S\)这个条件是没有用的,可以去掉

然后设\(f_i\)表示与\(i\)互质的数的个数,\(s_i\)表示\(gcd\)为\(i\)的集合个数,那么答案就是\(\sum f_is_i\)

然后设\(c_i\)表示\(i\)的个数

\[f_i=\sum_{d|i}^n\mu(d)\sum_{d|j}c_j
\]

然后可以处理出一个\(g_d=\sum_{d|j}c_j\)就可以了。

然后考虑\(s_i\)怎么处理

\[s_i=2^{c_i}-1-\sum_{i|d}(2^{c_d}-1)
\]

就好了。

然后这些都可以用狄利克雷前缀/后缀和\(O(n\log \log n)\)求


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e7+1,P=1e9+7;
int n,cnt,pri[N],mu[N],f[N],s[N],pw[N],ans;
bool v[N];
int main()
{
mu[1]=1;
for(int i=2;i<N;i++){
if(!v[i])pri[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*pri[j]<N;j++){
v[i*pri[j]]=1;
if(i%pri[j]==0)break;
mu[i*pri[j]]=-mu[i];
}
}
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
f[x]++;;
}
pw[0]=1;
for(int i=1;i<N;i++)pw[i]=pw[i-1]*2ll%P;
for(int j=1;j<=cnt;j++)
for(int i=N/pri[j];i>=1;i--)
f[i]+=f[i*pri[j]];
for(int i=1;i<N;i++)s[i]=pw[f[i]]-1;
for(int i=1;i<N;i++)f[i]=f[i]*mu[i];
for(int j=cnt;j>=1;j--)
for(int i=1;i*pri[j]<N;i++)
f[i*pri[j]]+=f[i];
for(int j=cnt;j>=1;j--)
for(int i=1;i*pri[j]<N;i++)
(s[i]-=s[i*pri[j]])%=P;
for(int i=2;i<N;i++)
(ans+=1ll*f[i]*s[i]%P)%=P;
printf("%d\n",(ans+P)%P);
return 0;
}

CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】的更多相关文章

  1. 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\) ...

  2. 「CF585E」 Present for Vitalik the Philatelist

    「CF585E」 Present for Vitalik the Philatelist 传送门 我们可以考虑枚举 \(S'=S\cup\{x\}\),那么显然有 \(\gcd\{S'\}=1\). ...

  3. 【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 ...

  4. 【CodeForces】585 E. Present for Vitalik the Philatelist

    [题目]E. Present for Vitalik the Philatelist [题意]给定n个数字,定义一种合法方案为选择一个数字Aa,选择另外一些数字Abi,令g=gcd(Ab1...Abx ...

  5. CF 585 E Present for Vitalik the Philatelist

    CF 585 E Present for Vitalik the Philatelist 我们假设 $ f(x) $ 表示与 $ x $ 互质的数的个数,$ s(x) $ 为 gcd 为 $ x $ ...

  6. 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛

    ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...

  7. CF585E:Present for Vitalik the Philatelist

    n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数. 好的统计题. 其实就 ...

  8. 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\)是数组中和 ...

  9. Codeforces 585E. Present for Vitalik the Philatelist(容斥)

    好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...

随机推荐

  1. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  2. mfc HackerTools防止程序双开

    来自:https://github.com/TonyChen56/HackerTools 1 HANDLE hMutex = CreateMutexA(NULL, FALSE, "GuiSh ...

  3. jQuery中的事件(八):on()、off()、bind()、unbind()、one()、hover()、hide()、show()、offset()等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  4. Go: 复合数据类型slice

    slice slice 表示用于相同类型元素的可变长度的序列. slice有三个属性:指针.长度和容量. 指针:slice存储数据的内部结构是数组,指针指向的是数组的地址 长度:保存slice中的元素 ...

  5. docker学习之network:初识网络配置

    起因 我的开发环境需要一个python代码运行环境.reids服务和mysql服务. 由于以前,我的开发环境是mac,而CI和线上运行环境是centos,偶尔会出项本地单元测试跑不过,而CI可以过.这 ...

  6. TFRecord读写简介+Demo 基于Ubuntu18.04+Tensorflow1.12 无WARNING

    简介 TFRecord是TensorFlow官方推荐使用的数据格式化存储工具. 它规范了数据的读写方式. 只要生成一次TFRecord,之后的数据读取和加工处理的效率都会得到提高. 将图片转换成TFR ...

  7. Install Percona XtraDb Cluster 5.6.20 on CentOS 6.5

    http://blog.51cto.com/hj192837/1546149 You should have odd number of real nodes. node #1hostname: pe ...

  8. 浅谈可持久化Trie与线段树的原理以及实现(带图)

    浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...

  9. JDK1.8源码(六)——java.util.ArrayList类

    ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Clonea ...

  10. 从环境搭建到打包使用TypeScript

    目录 1.TypeScript是什么 2.TypeScript增加了什么 3.TypeScript环境的搭建 4.TypeScript的基本类型 5.TypeScrip编译选项 6.TypeScrip ...