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. vue3.x自定义组件双向数据绑定v-model

    vue2.x 语法 在 2.x 中,在组件上使用 v-model 相当于绑定 value prop 并触发 input 事件: <ChildComponent v-model="pag ...

  2. UltraSoft - Beta - Scrum Meeting 1

    Date: May 17th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 维护Beta阶段文档 Liuzh 前端 增加删除操作按钮 Kkkk 前端 查询增加 ...

  3. linux下命令拼接

    前言:我个five,一道特别简单的拼接题没有做出来,我吐了,不过也是涨知识了 直接切入正题了 linux命令是可以拼接的,也就是说在一个system("???")下我们的???可以 ...

  4. CodeForces-1076E Vasya and a Tree

    CodeForces - 1076E Problem Description: Vasya has a tree consisting of n vertices with root in verte ...

  5. Spring:面向切面编程的AOP

    一.前言 除了依赖注入(DI),Spring框架提供的另一个核心功能是对面向方面的编程(AOP)的支持. AOP通常被称为实现横切关注点的工具.横切关注点一词是指应用程序中的逻辑不能与应用程序的其余部 ...

  6. STM32程序异常——中断处理要谨慎

    问题背景 最近有一个新项目(车载项目),板子上除了原来的ARM + STM32F030K6Tx又多了一个8bit的mcu的单片机,这可真是嵌入式全家福了. 系统的主要核心工作是由arm来完成,但是在开 ...

  7. path-sum leetcode C++

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  8. cf 12B Correct Solution?(贪心)

    题意: 一个数a,一个数b. 现在要将a的每一位上的数字重新整理,生成一个新的不含前导0的数a'. 问a'是否等于b. 思路: a上每一位的数字从小到大排序,找到最小的非零数和第一位交换. 代码: c ...

  9. hdu 5171 GTY's birthday gift(数学,矩阵快速幂)

    题意: 开始时集合中有n个数. 现在要进行k次操作. 每次操作:从集合中挑最大的两个数a,b进行相加,得到的数添加进集合中. 以此反复k次. 问最后集合中所有数的和是多少. (2≤n≤100000,1 ...

  10. 当src获取不到图片,onerror可指定一张默认的图片

    <img src="img/789.png" onerror="javascript:this.src='img/123.png';" alt=" ...