CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
正题
题目链接: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\)的个数
\]
然后可以处理出一个\(g_d=\sum_{d|j}c_j\)就可以了。
然后考虑\(s_i\)怎么处理
\]
就好了。
然后这些都可以用狄利克雷前缀/后缀和\(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【莫比乌斯反演,狄利克雷前缀和】的更多相关文章
- 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 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 ...
- 【CodeForces】585 E. Present for Vitalik the Philatelist
[题目]E. Present for Vitalik the Philatelist [题意]给定n个数字,定义一种合法方案为选择一个数字Aa,选择另外一些数字Abi,令g=gcd(Ab1...Abx ...
- CF 585 E Present for Vitalik the Philatelist
CF 585 E Present for Vitalik the Philatelist 我们假设 $ f(x) $ 表示与 $ x $ 互质的数的个数,$ s(x) $ 为 gcd 为 $ x $ ...
- 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛
ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...
- 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\)是数组中和 ...
- Codeforces 585E. Present for Vitalik the Philatelist(容斥)
好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...
随机推荐
- pytorch之对预训练的bert进行剪枝
大体过程 对层数进行剪枝 1.加载预训练的模型: 2.提取所需要层的权重,并对其进行重命名.比如我们想要第0层和第11层的权重,那么需要将第11层的权重保留下来并且重命名为第1层的名字: 3.更改模型 ...
- 使用F#编写PowerShell模块
▲F#和PowerShell模块 作为可能是人类世界最强大的Shell,PowerShell最大的特点是能够直接在命令间传递.NET对象,而支持这种能力的命令被称作cmdlet.自己编写PowerSh ...
- jsoup的Element类
一.简介 该类是Node的直接子类,同样实现了可克隆接口.类声明:public class Element extends Node 它表示由一个标签名,多个属性和子节点组成的html元素.从这个元素 ...
- CSS基本语法(慕课网学习笔记)
CSS的声明,内外联样式以及CSS的优先级 css学习.html <!DOCTYPE html> <html lang="en"> <head> ...
- 给MediaWiki增加看板娘
我们想给我们的mediawiki增加个像我博客里这样的看板娘,那么怎么做才好呢? 其实很简单,只要在相应的模板文件里增加指定代码就好了! 修改模板文件 找到模板文件skins/Vector/Vecto ...
- Win10 pip install augimg 报 OSError: [WinError 126] 找不到指定的模块,解决办法
第一种Win10下python成功安装augimg的方法: 下载Shapely,地址https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely,选择对应版本 ...
- Learning ROS: Roslaunch tips for large projects
Design tip: Top-level launch files should be short, and consist of include's to other files correspo ...
- PENETRATION第一步
PENETRATION第一步 第一次去打靶机,本来都快成功了,电脑蓝屏警告了...(=_=) 靶机下载连接 (https://download.vulnhub.com/admx/AdmX_new.7z ...
- Docker数据映射
1.映射目录 docker run -v 2.映射文件 docker run -v
- java多线程同步的5种方法
一.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常. 举个例子,如果一个银行账户同时被两个线程 ...