CF585E:Present for Vitalik the Philatelist
n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数。
好的统计题。
其实就是要对每个数求和他互质的,gcd不为1的集合数,容斥一下,求出所有gcd不为1的集合数A然后减去所有他的质因子对这个A的贡献。(这里的A是CF的题解的B)
那先看看所有gcd不为1的集合数怎么求。比如说2的倍数有cnt_2个,那能凑出2^cnt_2-1个集合,然后3的倍数有cnt_3个,能凑出2^cnt_3-1个集合,但有一些gcd为6的集合被算了两次,就要减去2^cnt_6-1,等等这不是莫比乌斯函数嘛,所以现在只要统计1~1e7中每个数作为多少个数的因数即可。那要把n个数都进行分解,这里可以在筛莫比乌斯的时候记一下每个数的最小质因子就可以n*logMax的时间内完成所有数的分解。由于miu_i=0的cnt_i对答案没贡献,所以每个数分解完的质因子不用去考虑那些次数大于1的部分,比如12=2*2*3直接看2和3即可。把不重复质数分解出来后,在1e7内一个数最多有8个不同质因子,所以枚举一下所有这些质因子能凑出的数即可计算miu_i不为0的cnt_i。
然后某个数的质因子对A的贡献呢?同理耶!
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<iostream>
using namespace std; int n;
#define maxn 500011
#define maxm 10000011
const int mod=1e9+;
int a[maxn]; int xiao[maxm],miu[maxm],prime[maxm],lp;bool notprime[maxm];
void pre(int n)
{
lp=;notprime[]=;
for (int i=;i<=n;i++)
{
if (!notprime[i]) {prime[++lp]=i;miu[i]=-;}
for (int j=;j<=lp && 1ll*prime[j]*i<=n;j++)
{
notprime[prime[j]*i]=;
xiao[prime[j]*i]=prime[j];
if (!(i%prime[j])) {miu[i*prime[j]]=;break;}
else miu[i*prime[j]]=-miu[i];
}
}
} int cnt[maxm],two[maxn];
int frac[],lf;
int main()
{
scanf("%d",&n);int Max=;
for (int i=;i<=n;i++) scanf("%d",&a[i]),Max=max(Max,a[i]);
two[]=;for (int i=;i<=n;i++) two[i]=(two[i-]<<)%mod;
pre(Max);
for (int i=;i<=n;i++)
{
int tmp=a[i];lf=;
while (xiao[tmp])
{
int now=xiao[tmp];
while (xiao[tmp]==now) tmp/=xiao[tmp];
frac[++lf]=now;
}
if (!lf || frac[lf]!=tmp) frac[++lf]=tmp;
for (int i=;i<(<<lf);i++)
{
int now=;
for (int j=;j<=lf;j++) if (i&(<<(j-))) now*=frac[j];
cnt[now]++;
}
}
int A=;
for (int i=;i<=Max;i++) A=(A-miu[i]*(two[cnt[i]]-))%mod; int ans=;
for (int i=;i<=n;i++)
{
int tmp=a[i];lf=;
while (xiao[tmp])
{
int now=xiao[tmp];
while (xiao[tmp]==now) tmp/=xiao[tmp];
frac[++lf]=now;
}
if (!lf || frac[lf]!=tmp) frac[++lf]=tmp;
int B=;
for (int i=;i<(<<lf);i++)
{
int now=;
for (int j=;j<=lf;j++) if (i&(<<(j-))) now*=frac[j];
B=(B-miu[now]*(two[cnt[now]]-))%mod;
}
ans=((ans+A)%mod-B)%mod;
}
printf("%d\n",(ans+mod)%mod);
return ;
}
CF585E:Present for Vitalik the Philatelist的更多相关文章
- 「CF585E」 Present for Vitalik the Philatelist
「CF585E」 Present for Vitalik the Philatelist 传送门 我们可以考虑枚举 \(S'=S\cup\{x\}\),那么显然有 \(\gcd\{S'\}=1\). ...
- 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\) ...
- 【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 ...
- CF 585 E Present for Vitalik the Philatelist
CF 585 E Present for Vitalik the Philatelist 我们假设 $ f(x) $ 表示与 $ x $ 互质的数的个数,$ s(x) $ 为 gcd 为 $ x $ ...
- Codeforces 585E. Present for Vitalik the Philatelist(容斥)
好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...
- Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)
Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的 D1E 罢--虽然我不会做/kk u1s1 似乎这场 Div1 挺水的?F 就是个 AC 自动机板子还被评到了 3k2-- ...
- 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\)是数组中和 ...
- CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为\(n\)的可重集\(T\),求有多少个它的非空子集\(S\)和元素\(x\)满 ...
随机推荐
- Lena Sort 构造题,很多细节的模拟
https://www.hackerrank.com/contests/101hack46/challenges/lena-sort 把题目转换成一颗二叉树,也就是当前的节点是cur,然后大的,放右边 ...
- 转】Neo4j集群安装实践
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! Posted: Oct 29, 2013 Ta ...
- 2017广东工业大学程序设计竞赛决赛 H tmk买礼物
题意: Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第21 ...
- 【JavaScript】之函数的this
提起函数中的this是很多初学者较为苦恼的,也是很多工作一段时间的人也存在误解的,你问this指向的是谁,大多数人会随口一答当然是指向调用这个函数的元素,当然这也没什么错,可是函数的调用方法不同thi ...
- 详解Android Activity启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- ScrollView嵌套GridView,GridView显示不全
最近开发有个需求是以A-Z的方式区分全国城市(搜索功能),并实现字母索引的功能(有点类似微信,不过比较坑的是用的是GridView, 并且GridView上面还有几个LinearLayout). 详细 ...
- idea 调试工具的使用
原文:https://blog.csdn.net/hao_hl1314/article/details/53120918 Intellij IDEA Debug调试区工具的使用方法 快捷键F9 ...
- web页面打印--铺满A4
css <style type="text/css"> body { margin: 0; padding: 0; background-color: #FAFAFA; ...
- [Windows Server 2012] MySQL移机方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:MySQL ...
- 通过SSDT HOOK实现进程保护和进程隐藏
---恢复内容开始--- 首先,我要说一件很重要的事,本人文采不好,如果哪里说的尴尬了,那你就尴尬着听吧...... SSDT HOOK最初貌似源于Rookit,但是Rookit之前有没有其他病毒使用 ...