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\)是数组中和 ...
随机推荐
- python streamlit 速成web页面,深度学习模型展示.
# 点我查看 参考文献 py中一个web应用,Streamlit 是一个开源 Python 库,可让您轻松创建和共享用于机器学习和数据科学的精美自定义 Web 应用程序.只需几分钟,您就可以构建和部 ...
- OO课第三单元总结
一.梳理JML语言的理论基础 (1)理论基础 JMl的出现很大程度上一为了行为接口的规范化,用这种语言来指定特定模块的特定功能.JML的核心部分分为三个部分:前置条件(requires).后置条件(e ...
- spring、spring boot中配置多数据源
在项目开发的过程中,有时我们有这样的需求,需要去调用别的系统中的数据,那么这个时候系统中就存在多个数据源了,那么我们如何来解决程序在运行的过程中到底是使用的那个数据源呢? 假设我们系统中存在2个数据源 ...
- hdu 1394 Minimum Inversion Number(线段树or树状数组)
题意: 给你N个数,N个数是0~N-1的一个全排列. 要求统计它的所有形式的逆序对的最小值.它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面. 逆序对:i<j且ai>aj 思 ...
- Win powershell执行策略配置
参考连接:https://blog.csdn.net/jeffxu_lib/article/details/84710386 参考连接:http://www.cragsman.org/index.ph ...
- linux下c语言实现简单----线程池
这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用.线程的优点有好多,它是"轻量级的进程",所需资源 ...
- SpringBoot2.x异步任务EnableAsync
1.springboot启动类里面使用@EnableAsync注解开启异步功能 @EnableAsync public class Demo001Application { public static ...
- 【java+selenium3】自动化截图 (十四)
一.截图 1. Firefox浏览器截图 FirefoxDriver firefoxDriver = new FirefoxDriver(); firefoxDriver.getScreenshotA ...
- 解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题
解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题 错误提示信息 There might be a problem with t ...
- 用 Python 修改微信(支付宝)运动步数,轻松 TOP1
用 Python 修改微信(支付宝)运动步数,轻松 TOP1 项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该py ...