Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)
一道不算太难的 D1E 罢……虽然我不会做/kk
u1s1 似乎这场 Div1 挺水的?F 就是个 AC 自动机板子还被评到了 3k2……
首先我们注意到对于固定的 \(x\) 及集合 \(S\),如果 \(\gcd(S)>1,\gcd(x,\gcd(S))=1\) 那么必然有 \(x\notin S\),否则显然有 \(\gcd(S)=\gcd(x,\gcd(S))\) 可立即推出矛盾,也就是说我们可以直接忽略这个条件。我们考虑直接枚举 \(\gcd(S)=x\),设 \(f_x\) 表示 \(\gcd(S)=x\) 的集合 \(S\),\(g_x\) 表示 \(a_{1...n}\) 中有多少个数与 \(x\) 互质,那么这种情况对答案的贡献显然为 \(f_xg_x\),累加一下即可,即 \(ans=\sum\limits_{x>1}f_xg_x\)
接下来考虑怎样求 \(f_x,g_x\),首先是 \(f_x\),按照套路我们设 \(c_x\) 为可重集中 \(x\) 出现了多少次,这样我们可以枚举值 instead of 下标,即 \(f_x=\sum\limits_{y}[\gcd(x,y)=1]c_y\),我们按照套路进行莫反:
f_x&=\sum\limits_{y}[\gcd(x,y)=1]c_y\\
&=\sum\limits_{y}\sum\limits_{d\mid x,d\mid y}\mu(d)c_y\\
&=\sum\limits_{d\mid x}\mu(d)\sum\limits_{d\mid y}c_y
\end{aligned}
\]
接下来考虑 \(g_x\),首先直接求是不容易的,不过按照套路我们设 \(h_x=\sum\limits_{x\mid y}g_y\),即 \(x\mid\gcd(S)\) 的集合 \(S\) 个数。那么关于,显然所有是 \(x\) 的倍数的数都可以被加入进 \(S\) 中,如果我们设 \(t_x\) 表示可重集中有多少个数是 \(x\) 的倍数,那么显然有 \(h_x=2^{t_x}\)。而显然 \(t_x=\sum\limits_{x\mid y}c_y\),故上面 \(f_x\) 的式子又可以改写为 \(f_x=\sum\limits_{d\mid x}\mu(d)t_d\)
因此接下来我们只用实现三个操作:
- 已知 \(c_x\) 求 \(t_x=\sum\limits_{x\mid y}c_y\)
- 已知 \(\mu(d)t_d\) 求 \(f_x=\sum\limits_{d\mid x}\mu(d)t_d\)
- 根据 \(h_x\) 即 \(h_x=\sum\limits_{x\mid y}g_y\) 反解出 \(g_x\)
不难发现这三个操作实际上是等价的,都可以写成类似于给定序列 \(a\) 求序列 \(b\) 满足 \(b_i=\sum\limits_{j\mid i}a_j\) 的形式。考虑什么样的 \(i,j\) 满足 \(a_i\) 会对 \(b_j\) 产生贡献,我们将 \(i,j\) 分解质因数,那么对于质因子 \(p\),如果 \(i\) 的质因数分解式中 \(p\) 的次数为 \(\alpha\),\(j\) 的质因数分解式中 \(p\) 的次数为 \(\beta\) 那么必须有 \(\alpha\ge\beta\),因此可以将这玩意儿看作一个 \(\pi(n)\) 维的高维前缀和,按照高维前缀和的套路跑一下即可,时间复杂度 \(n\log\log n\),据说这玩意儿有个专门的名字叫 dirichlet 狄利克雷前缀和?
const int MAXN=5e5;
const int MAXM=1e7;
const int MOD=1e9+7;
int n,pw[MAXN+5],c[MAXM+5],f[MAXM+5],g[MAXM+5];
int pr[MAXM/10+5],pcnt=0,mu[MAXM+5];
bitset<MAXM+5> vis;
void sieve(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){pr[++pcnt]=i;mu[i]=-1;}
for(int j=1;j<=pcnt&&pr[j]*i<=n;j++){
vis[pr[j]*i]=1;
if(i%pr[j]==0) break;
else mu[i*pr[j]]=-mu[i];
}
}
}
int main(){
scanf("%d",&n);pw[0]=1;sieve(MAXM);
for(int i=1;i<=n;i++) pw[i]=pw[i-1]*2%MOD;
for(int i=1,x;i<=n;i++) scanf("%d",&x),c[x]++;
for(int i=1;i<=pcnt;i++) for(int j=MAXM/pr[i];j;j--) c[j]+=c[j*pr[i]];
for(int i=1;i<=MAXM;i++) f[i]=pw[c[i]]-1,g[i]=c[i]*mu[i];
for(int i=1;i<=pcnt;i++) for(int j=1;j*pr[i]<=MAXM;j++) g[j*pr[i]]+=g[j];
for(int i=1;i<=pcnt;i++) for(int j=1;j*pr[i]<=MAXM;j++) f[j]=(f[j]-f[j*pr[i]]+MOD)%MOD;
int ans=0;for(int i=2;i<=MAXM;i++) ans=(ans+1ll*g[i]*f[i])%MOD;
printf("%d\n",ans);
return 0;
}
Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)的更多相关文章
- Codeforces 585E. Present for Vitalik the Philatelist(容斥)
好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...
- CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为\(n\)的可重集\(T\),求有多少个它的非空子集\(S\)和元素\(x\)满 ...
- 【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 ...
- 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\) ...
- 「CF585E」 Present for Vitalik the Philatelist
「CF585E」 Present for Vitalik the Philatelist 传送门 我们可以考虑枚举 \(S'=S\cup\{x\}\),那么显然有 \(\gcd\{S'\}=1\). ...
- 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的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数. 好的统计题. 其实就 ...
- 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\)是数组中和 ...
随机推荐
- 【UE4】GAMES101 图形学作业2:光栅化和深度缓存
总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...
- 第三次Alpha Scrum Meeting
本次会议为Alpha阶段第三次Scrum Meeting会议 会议概要 会议时间:2021年4月26日 会议地点:线上会议 会议时长:20min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...
- BUAA_2019_OO_第一单元总结
一.基于度量来分析自己的程序结构 1.第一次作业 1.1类图: 第一次作业由于比较简单,我采用了面向过程的编程方式.在Polynomail类的构造函数中将项直接求导输出.这样的弊端显而易见,不能进行优 ...
- 「刷题」THUPC泛做
刷了一下,写一下. T1. 天天爱射击 可以这样想. 我们二分一下每一块木板在什么时刻被击碎. 然后直接用主席树维护的话是\(O(nlog^2n)\)的. 会\(T\),而且是一分不给那种... 那么 ...
- 函数指针和qsort函数
1.函数指针的形式: 函数指针:int (*funcP) (int *a, int *b) 表示定义了一个funcP函数指针,指向了返回值为int类型,参数为int* 和int* 的函数 使用方式: ...
- Python课程笔记(七)
今天学习神奇的海龟,非常有意思,还有很多图片想去绘制,分享一个turtle绘图网站: https://www.python123.io/index/turtles/latest , 要是可以分享出源码 ...
- Python学习笔记总结
目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...
- js和jq文档操作
JS文档操作 一.dom树结构 1.元素节点 2.文本节点 3.属性节点 不属于元素节点的子节点 4.文档节点(document) 二.处理元素节点 method 1.docu ...
- 重装系统——联想window 10
大四了,读了四年大学,唉,混的,啥也不会,工作也找不到,真的不知道这大学四年到底干了什么.专业是计算机方向的,但居然,不敢,也不会装电脑系统,大学四年的文件都是乱放的,更那个的是,有些软件卸载不完全, ...
- 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘
#深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...