C. Mike and Foam
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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.

Output

For each query, print the answer for that query in one line.

Sample test(s)
Input
5 6
1 2 3 4 6
1
2
3
4
5
1
Output
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(容斥)的更多相关文章

  1. Codeforces.547C.Mike and Foam(容斥/莫比乌斯反演)

    题目链接 \(Description\) 给定n个数(\(1\leq a_i\leq 5*10^5\)),每次从这n个数中选一个,如果当前集合中没有就加入集合,有就从集合中删去.每次操作后输出集合中互 ...

  2. 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 ...

  3. codeforces #305 C Mike and Foam

    首先我们注意到ai<=50w 因为2*3*5*7*11*13*17=510510 所以其最多含有6个质因子 我们将每个数的贡献分离, 添加就等于加上了跟这个数相关的互素对 删除就等于减去了跟这个 ...

  4. 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 ...

  5. Codeforces 547C/548E - Mike and Foam 题解

    目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...

  6. UVA11806Cheerleaders(容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目意思:在m行n列的矩形网格中放k个相同的石子,问有多少中方法?每个格子最多放一 ...

  7. 【CF715E】Complete the Permutations(容斥,第一类斯特林数)

    [CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...

  8. 【容斥原理,莫比乌斯反演】用容斥替代莫比乌斯反演第二种形式解决gcd统计问题

    名字虽然很长.但是其实很简单,对于这一类问题基本上就是看你能不能把统计的公式搞出来(这时候需要一个会推公式的队友) 来源于某次cf的一道题,盼望上紫的我让潘学姐帮我代打一道题,她看了看跟我说了题解,用 ...

  9. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

随机推荐

  1. sublime配置java编译环境

    Windows下配置Sublime Text3的Java环境 字数507 阅读2301 评论2 喜欢2 Sublime Text3是一个比较好用的IDE.截图如下: java环境截图 下面就简单介绍下 ...

  2. C#和Javascript的try…catch…finally的一点差别

    C#中规定:如果程序的控制流进入了一个带finally块的try语句,那么finally语句块始终会被执行 例子: class Program { static void Main(string[] ...

  3. Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'xxx': no matching editors or conversion strategy found

    今天在完成项目的时候遇到了下面的异常信息: 04-Aug-2014 15:49:27.894 SEVERE [http-apr-8080-exec-5] org.apache.catalina.cor ...

  4. import_site

    http://kfd.me/ https://google.kfd.me/webhp?newwindow=1&safe=active http://googlebridge.com/searc ...

  5. Myeclipse如何设置字体大小

    由于Myeclipse一般是英文版的,这就给英语不太好的人带来了一定的麻烦,有时连设置个字体都无法顺利进行!!! 工具/原料   Myeclipse 方法/步骤   双击启动Myeclipse 点击& ...

  6. ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!

    ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!       执行 nginx 重启服务时,提示失败如下: $ sudo service ngi ...

  7. BigDecimal类

    如果需要精确的计算结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. //========================================== ...

  8. 用javascript替换URL中的参数值

    <script> function changeUrlArg(url, arg, val){ var pattern = arg+'=([^&]*)'; var replaceTe ...

  9. C++strng流(入门级)

    /************************************************************************* * * FILENAME: stringTest. ...

  10. Log4cpp配置文件格式说明

    Log4cpp配置文件格式说明 博客分类: log4cpp log4cpp  log4cpp有3个主要的组件:categories(类别).appenders(附加目的地).和 layouts(布局) ...