cf#305 Mike and Foam(容斥)
2 seconds
256 megabytes
standard input
standard output
Mike is a bartender at Rico's bar. At Rico's, they put beer glasses in a special shelf. There are n kinds of beer at Rico's numbered from 1 to n. i-th kind of beer has ai milliliters of foam on it.

Maxim is Mike's boss. Today he told Mike to perform q queries. Initially the shelf is empty. In each request, Maxim gives him a number x. If beer number x is already in the shelf, then Mike should remove it from the shelf, otherwise he should put it in the shelf.
After each query, Mike should tell him the score of the shelf. Bears are geeks. So they think that the score of a shelf is the number of pairs (i, j) of glasses in the shelf such that i < j and
where
is the greatest common divisor of numbers a and b.
Mike is tired. So he asked you to help him in performing these requests.
The first line of input contains numbers n and q (1 ≤ n, q ≤ 2 × 105), the number of different kinds of beer and number of queries.
The next line contains n space separated integers, a1, a2, ... , an (1 ≤ ai ≤ 5 × 105), the height of foam in top of each kind of beer.
The next q lines contain the queries. Each query consists of a single integer integer x (1 ≤ x ≤ n), the index of a beer that should be added or removed from the shelf.
For each query, print the answer for that query in one line.
5 6
1 2 3 4 6
1
2
3
4
5
1
0
1
3
5
6
2
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
typedef long long ll ;
const int M = 5e5 + ;
int n , q ;
int a[M] ;
int dp[M] , cnt[M] ;
bool vis[M] ;
std::vector <int> g[M] ; void table ()
{
dp[] = ;
for (int i = ; i < M ; i ++) {
if (dp[i]) g[i].push_back(i) ;
for (int j = i + i ; j < M ; j += i ) {
if (dp[i]) g[j].push_back(i) ;
dp[j] -= dp[i] ;
}
}
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
table () ;
scanf ("%d%d" , &n , &q) ;
for (int i = ; i <= n ; i ++) scanf ("%d" , &a[i]) ;
ll ans = ;
while (q --) {
int x ;
scanf ("%d" , &x) ;
if (vis[x]) {
for (int i : g[ a[x] ]) ans -= 1ll * dp[i] * (-- cnt [i]) ;
} else {
for (int i : g[ a[x] ]) {
ans += 1ll * dp[i] * (cnt[i] ++) ;
}
}
vis[x] ^= ;
printf ("%I64d\n" , ans) ;
}
return ;
}
第一次接触容斥问题,但已接触过默比乌斯反演。orz
容斥简单来说是这样的:
有n个群学生选了A课程,B课程,C课程。其中选了A课程的为集合{A},B的为集合{B}人,C的为集合{C}。
那么n = A + B + C - A&B - B&C - A&C + A&B&C ;
通过观察,我们可以yy出这样的性质:
奇数集合:A , B , C , A&B&C …… 指奇数个集合形成的交集。
偶数集合:A&B , B&C , A&C …… 指偶数个集合形成的交集。
so n = sum(奇数集合) - sum(偶数集合);
再回到这道题目上来:
用单纯的想法来思考:initial cnt = 0 , set = {} ; cnt 用来记录当前的set中互质的对数 。
while (query --)
get (x) ;
travel set ---> if (find set(i) 互质 x)cnt ++ ;
set.insert (x) ;
end;
复杂度O(n^2);
来优化一下吧,如过我们知道1~5e5 里每个数的所有因数。并用一个cnt[ 50000 ]来表示当前集合中放的因数的出现次数:
比如说放了2 : 1 , 2, 3 : 1 , 3, 6 : 1 , 2 , 3 , 6 。
那么cnt[1] = 3 , cnt[2] = 2 , cnt [3] = 3 , cnt[6] = 1 ;
........然后自己yy吧。
感谢PauGra非常简单明了的code:
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
typedef long long ll ;
const int M = 5e5 + ;
int n , q ;
int a[M] ;
int dp[M] , cnt[M] ;
bool vis[M] ;
std::vector <int> g[M] ; void table ()
{
dp[] = ;
for (int i = ; i < M ; i ++) {
if (dp[i]) g[i].push_back(i) ;
for (int j = i + i ; j < M ; j += i ) {
if (dp[i]) g[j].push_back(i) ;
dp[j] -= dp[i] ;
}
}
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
table () ;
printf ("27: %d\n" , dp[]) ;
scanf ("%d%d" , &n , &q) ;
for (int i = ; i <= n ; i ++) scanf ("%d" , &a[i]) ;
ll ans = ;
while (q --) {
int x ;
scanf ("%d" , &x) ;
if (vis[x]) {
for (int i : g[ a[x] ]) ans -= 1ll * dp[i] * (-- cnt [i]) ;
} else {
for (int i : g[ a[x] ]) {
ans += 1ll * dp[i] * (cnt[i] ++) ;
}
}
vis[x] ^= ;
printf ("%I64d\n" , ans) ;
}
return ;
}
cf#305 Mike and Foam(容斥)的更多相关文章
- Codeforces.547C.Mike and Foam(容斥/莫比乌斯反演)
题目链接 \(Description\) 给定n个数(\(1\leq a_i\leq 5*10^5\)),每次从这n个数中选一个,如果当前集合中没有就加入集合,有就从集合中删去.每次操作后输出集合中互 ...
- Codeforces 548E Mike ans Foam (与质数相关的容斥多半会用到莫比乌斯函数)
题面 链接:CF548E Description Mike is a bartender at Rico's bar. At Rico's, they put beer glasses in a sp ...
- codeforces #305 C Mike and Foam
首先我们注意到ai<=50w 因为2*3*5*7*11*13*17=510510 所以其最多含有6个质因子 我们将每个数的贡献分离, 添加就等于加上了跟这个数相关的互素对 删除就等于减去了跟这个 ...
- CF(439E - Devu and Birthday Celebration)莫比乌斯容斥
题意:将n个糖果插入f-1个挡板分成f分(a1,a2,a3...af). 问有多少种分法能够使得gcd(a1,a2,a3...af)=1; 解法.莫比乌斯容斥,首先按1为单位分,这时候有C(n-1,f ...
- Codeforces 547C/548E - Mike and Foam 题解
目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...
- UVA11806Cheerleaders(容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 题目意思:在m行n列的矩形网格中放k个相同的石子,问有多少中方法?每个格子最多放一 ...
- 【CF715E】Complete the Permutations(容斥,第一类斯特林数)
[CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...
- 【容斥原理,莫比乌斯反演】用容斥替代莫比乌斯反演第二种形式解决gcd统计问题
名字虽然很长.但是其实很简单,对于这一类问题基本上就是看你能不能把统计的公式搞出来(这时候需要一个会推公式的队友) 来源于某次cf的一道题,盼望上紫的我让潘学姐帮我代打一道题,她看了看跟我说了题解,用 ...
- BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)
题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...
随机推荐
- Maven中配置maven-compiler-plugin插件
这个插件就如同名字所显示的这样,用来编译源代码的. 加载第三方包 <dependency> <groupId>cn.eshore.bnet</groupId> &l ...
- [Android]Volley源码分析(一)
一. 如何使用Volley? 1. 首先定义一个RequestManager类,用来在Android程序启动时对Volley进行初始化.RequestManager为单例类,因为只有在程序启动时调用, ...
- html内容写入到文件中的时候出现‘TypeError: expected a character buffer object’错误
代码如下: with open('ryf.md', 'a') as f: f.write(content) # content是html内容 原因是写入文件要求写入内容是str,直接转换成str即可, ...
- Theano tutorial – basic type
博客摘自:Deep learning 第二篇 婴儿学步 Theano如何做算数? import theano.tensor as T from theano import function x=T.d ...
- hdu 2031 杨辉三角
题意:显示杨辉三角形. 解法: 组合数学公式:combi(n,m)=combi(n-1,m-1)+combi(n-1,m); 至于为什么有这个公式呢?那就是高中数学的内容啦 1: #include&l ...
- android service 本地 远程 总结
android编写Service入门 android SDK提供了Service,用于类似*nix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service) ...
- Python基本数据类型之tuple
一.创建元组: ages = (11, 22, 33, 44, 55) ages = tuple((11, 22, 33, 44, 55)) 元组和列表几乎一样 元组的元素不可修改,但是元组元素的元素 ...
- 【转】Yeoman自动构建 Angularjs 项目
Yeoman是什么? Yeoman按照官方说法,它不只是一个工具,还是一个工作流.它其实包括了三个部分yo.grunt.bower,分别用于项目的启动.文件操作.包管理. Yo: Yo是一个项目初始化 ...
- springmvc 注解 配置文件解释
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
- matlab连接sql数据库
最近项目还涉及到matlab连接数据库,下面我就记录如何进行配置使得matlab能够连接sql数据库.由于最近工程做的多一些,所以分享的都在工程配置上,当初为了这些配置可是反复卸载与重装,算法其实也有 ...