Codeforces 题目传送门 & 洛谷题目传送门

一道不算太难的 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\),我们按照套路进行莫反:

\[\begin{aligned}
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(简单莫反+狄利克雷前缀和)的更多相关文章

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

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

  2. CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】

    正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为\(n\)的可重集\(T\),求有多少个它的非空子集\(S\)和元素\(x\)满 ...

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

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

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

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

  6. 「CF585E」 Present for Vitalik the Philatelist

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

  7. CF 585 E Present for Vitalik the Philatelist

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

  8. CF585E:Present for Vitalik the Philatelist

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

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

随机推荐

  1. 【UE4】GAMES101 图形学作业2:光栅化和深度缓存

    总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...

  2. 第三次Alpha Scrum Meeting

    本次会议为Alpha阶段第三次Scrum Meeting会议 会议概要 会议时间:2021年4月26日 会议地点:线上会议 会议时长:20min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...

  3. BUAA_2019_OO_第一单元总结

    一.基于度量来分析自己的程序结构 1.第一次作业 1.1类图: 第一次作业由于比较简单,我采用了面向过程的编程方式.在Polynomail类的构造函数中将项直接求导输出.这样的弊端显而易见,不能进行优 ...

  4. 「刷题」THUPC泛做

    刷了一下,写一下. T1. 天天爱射击 可以这样想. 我们二分一下每一块木板在什么时刻被击碎. 然后直接用主席树维护的话是\(O(nlog^2n)\)的. 会\(T\),而且是一分不给那种... 那么 ...

  5. 函数指针和qsort函数

    1.函数指针的形式: 函数指针:int (*funcP) (int *a, int *b) 表示定义了一个funcP函数指针,指向了返回值为int类型,参数为int* 和int* 的函数 使用方式: ...

  6. Python课程笔记(七)

    今天学习神奇的海龟,非常有意思,还有很多图片想去绘制,分享一个turtle绘图网站: https://www.python123.io/index/turtles/latest , 要是可以分享出源码 ...

  7. Python学习笔记总结

    目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...

  8. js和jq文档操作

    JS文档操作 一.dom树结构 1.元素节点 2.文本节点 3.属性节点      不属于元素节点的子节点  4.文档节点(document) 二.处理元素节点    method    1.docu ...

  9. 重装系统——联想window 10

    大四了,读了四年大学,唉,混的,啥也不会,工作也找不到,真的不知道这大学四年到底干了什么.专业是计算机方向的,但居然,不敢,也不会装电脑系统,大学四年的文件都是乱放的,更那个的是,有些软件卸载不完全, ...

  10. 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘

    #深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...