【CodeForces】585 E. Present for Vitalik the Philatelist
【题目】E. Present for Vitalik the Philatelist
【题意】给定n个数字,定义一种合法方案为选择一个数字Aa,选择另外一些数字Abi,令g=gcd(Ab1...Abx),要求满足g≠1且gcd(Aa,g)=1,求方案数取模1e9+7。2<=n<=5*10^5,2<=ai<=10^7。
【算法】数论,计数问题
【题解】
考虑选择一些数字使得g≠1,容易想到枚举g值,O(n ln n)地枚举g的倍数,得到b[g]表示数列中数字为g的倍数的个数。
那么含有公因数g的区间数为2^b[g]-1,考虑容斥。
引入莫比乌斯函数μ(x),简单定义:μ(1)=1,含奇数个素因子μ(x)=-1,含偶数个素因子μ(x)=1,含重复素因子μ(x)=0。
根据容斥原理的奇加偶减,应将-μ[g]作为系数,那么总方案数就是sum=Σ-μ(g)*(2^b[g]-1),g=2~max(ai)。
接下来考虑区间和数字Aa组合,会减去gcd和Aa不互质的区间,也就是去掉公因数含有Aa的素因子的区间,这实际上也是莫比乌斯函数容斥。
所以可以套用在原来的容斥上,也就是对于数字Aa,只要将Aa的所有因子g的μ(g)视为0,计算出来的sum就是数字Aa的贡献。
那么再换个角度,含有公因数g的区间只会在数字Aa不含因子g的时候被贡献,这样的数字数实际上是n-b[g]。
所以,ans=Σ-μ(g)*(2^b[g]-1)*(n-b[g]),g=2~max(ai)。
最后,可以用自带容斥的方法避开μ的计算。最后视为对(2^b[g]-1)*(n-b[g])进行容斥(即使这样容斥没有实际含义),然后减去f[h](h=k*g),得到f[g]。ans=Σf[g]。(这种方法和埃式筛μ的本质相同)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=,N=,M=1e9+;
int n,x,b[N],fx[maxn],f[N],ans=,mx=;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&x),mx=max(mx,x),b[x]++;
fx[]=;for(int i=;i<=n;i++)fx[i]=(fx[i-]<<)%M;
for(int g=mx;g>=;g--){
x=b[g];
for(int i=g+g;i<=mx;i+=g){
x+=b[i];
f[g]=(f[g]-f[i]+M)%M;
}
if(g!=){
f[g]=(f[g]+1ll*(fx[x]-)*(n-x)%M)%M;
ans=(ans+f[g])%M;
}
}
printf("%d",ans);
return ;
}
【CodeForces】585 E. Present for Vitalik the Philatelist的更多相关文章
- CF 585 E Present for Vitalik the Philatelist
CF 585 E Present for Vitalik the Philatelist 我们假设 $ f(x) $ 表示与 $ x $ 互质的数的个数,$ s(x) $ 为 gcd 为 $ x $ ...
- 【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】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- 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\). ...
- 【CodeForces】601 D. Acyclic Organic Compounds
[题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...
- 【Codeforces】849D. Rooter's Song
[算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...
- 【CodeForces】983 E. NN country 树上倍增+二维数点
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...
随机推荐
- android入门 — Activity启动模式
1.standard模式 standard模式是系统的默认启动方式,每次激活Activity都会创建Activity,并放在任务栈中. 系统不会在乎活动是否已经存在于返回栈中,每次启动都会创建该活动的 ...
- erlang随机排列数组
参考karl's answer 1> L = lists:seq(1,10). [1,2,3,4,5,6,7,8,9,10] Associate a random number R with e ...
- WordPress使用淘宝IP地址库的API显示评论者的位置信息(二)
1 淘宝IP地址库的接口说明 在上一篇文章<WordPress使用淘宝IP地址库的API显示评论者的位置信息(一)>中,vfhky使用了新浪工具提供的这个IP接口显示博客评论者的位置信息. ...
- docker 开启远程
# vi /etc/init.d/docker 在start()中加入:$exec -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -d & ...
- [计算机网络] DNS劫持和DNS污染
DNS劫持,指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为.范例就是收到各种推送广告等网站. DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户 ...
- 第196天:js---调用函数的五种方式
一.普通方式 /*普通模式*/ // 声明一个函数,并调用 function func() { console.log("Hello World"); } func(); 二.函数 ...
- MySQL join 使用方法
JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(tab ...
- 2个 List<T>进行数据合并
var userF = new List<User>(); User m1 = new User() { Id = "0" }; userF.Add(m1); var ...
- Spring Boot系列教程八: Mybatis使用分页插件PageHelper
一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...
- WPA-PSK无线网络破解原理及过程
原文链接地址:http://www.freebuf.com/articles/wireless/58342.html 本文将主要讲讲WPA-PSK类型的无线网络安全问题,首先我们看下802.11协议相 ...