[CSP-S模拟测试]:gcd(莫比乌斯反演)
题目描述
有$n$个正整数$x_1\sim x_n$,初始时状态均为未选。有$m$个操作,每个操作给定一个编号$i$,将$x_i$的选取状态取反。每次操作后,你需要求出选取的数中有多少个互质的无序数对。
输入格式
第一行两个整数$n,m$。第二行$n$个整数$x_1\sim x_n$。接下来$m$行每行一个整数。
输出格式
$m$行,每行一个整数表示答案。
样例
样例输入:
4 5
1 2 3 4
1
2
3
4
1
样例输出:
0
1
3
5
2
数据范围与提示
对于$20\%$的数据,$n,m\leqslant 1,000$。
对于另外$30\%$的数据,$x_i\leqslant 100$。
对于$100\%$的数据,$n,m\leqslant 200,000$,$x_i\leqslant 500,000$,$1\leqslant i\leqslant n$。
题解
我们先来设三个量:
$\alpha.s(i)$表示为$i$的倍数的数的个数。
$\beta.g(i)$表示 $gcd$为$i$的倍数的数个数。
$\gamma.f(i)$表示$gcd$为$i$的数的个数。
$s(i)$很好就能求出,而$g(i)=\frac{s(i)\times (s(i)-1))}{2}$,但是我们需要的是$f(i)$,该怎么办呢?
显然,$g(i)=\sum \limits_{i|d}f(d)$,那有又什么用呢?
这里就需要用到一个神奇的东东了:第二类莫比乌斯反演(详见信息学奥赛之数学一本通P145中间)。
于是这个式子便变成了:$f(i)=\sum \limits_{i|d}\mu(\frac{d}{i})g(d)$。
现在我们需要考虑的就只有修改操作了,每次插入或删除一个数的时候只要暴力枚举其因数即可。
时间复杂度:$\Theta(m\sqrt{\max x_i})$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[200001];
long long s[500001],g[500001],f[500001];
long long mu[500001],prime[500001],cnt;
bool vis[200001],v[500001];
long long ans,mx;
void pre_work()
{
mu[1]=1;
for(int i=2;i<=mx;i++)
{
if(!v[i])mu[prime[cnt++]=i]=-1;
for(int j=0;j<cnt&&i*prime[j]<=mx;j++)
{
v[i*prime[j]]=1;
if(i%prime[j])mu[i*prime[j]]=-mu[i];
else{mu[i*prime[j]]=0;break;}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),mx=max(mx,a[i]);
pre_work();
while(m--)
{
int x,flag;
scanf("%d",&x);
flag=a[x];
if(vis[x])
{
for(int i=1;i*i<=flag;i++)
if(!(flag%i))
{
s[i]--;
ans-=mu[i]*g[i];
g[i]=s[i]*(s[i]-1)/2;
ans+=mu[i]*g[i];
if(flag/i!=i)
{
s[flag/i]--;
ans-=mu[flag/i]*g[flag/i];
g[flag/i]=s[flag/i]*(s[flag/i]-1)/2;
ans+=mu[flag/i]*g[flag/i];
}
}
vis[x]=0;
}
else
{
for(int i=1;i*i<=flag;i++)
if(!(flag%i))
{
s[i]++;
ans-=mu[i]*g[i];
g[i]=s[i]*(s[i]-1)/2;
ans+=mu[i]*g[i];
if(flag/i!=i)
{
s[flag/i]++;
ans-=mu[flag/i]*g[flag/i];
g[flag/i]=s[flag/i]*(s[flag/i]-1)/2;
ans+=mu[flag/i]*g[flag/i];
}
}
vis[x]=1;
}
printf("%lld\n",ans);
}
return 0;
}
rp++
[CSP-S模拟测试]:gcd(莫比乌斯反演)的更多相关文章
- [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
- HDU1695 GCD(莫比乌斯反演)
传送门 看了1个多小时,终于懂了一点了 题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数 思路:令F(i)表示i|gcd(x,y)的 ...
- hdu 1695 GCD 莫比乌斯反演入门
GCD 题意:输入5个数a,b,c,d,k;(a = c = 1, 0 < b,d,k <= 100000);问有多少对a <= p <= b, c <= q <= ...
- 洛谷P2257 YY的GCD 莫比乌斯反演
原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...
- HYSBZ - 2818 Gcd (莫比乌斯反演)
莫比乌斯反演的入门题,设 \(F(x): gcd(i,j)\%x=0\) 的对数,\(f(x): gcd(i,j)=x\)的对数. 易知\[F(p) = \lfloor \frac{n}{p} \rf ...
- 【BZOJ2818】Gcd [莫比乌斯反演]
Gcd Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 给定整数N,求1<=x,y&l ...
- Luogu P2257 YY的GCD 莫比乌斯反演
第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...
- BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2534 Solved: 1129 [Submit][Status][Discu ...
- BZOJ 2820 luogu 2257 yy的gcd (莫比乌斯反演)
题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便 ...
随机推荐
- Run Your Tensorflow Deep Learning Models on Google AI
People commonly tend to put much effort on hyperparameter tuning and training while using Tensoflow& ...
- (转)https://wiki.debian.org/iwlwifi debian7下wifi intel 5100agn
https://wiki.debian.org/iwlwifi Debian 7 "Wheezy" Add a "non-free" component to ...
- SQLServer2008查询时对象名无效
情况一:如果表名是关键字,查询时把表名括起来,不作为关键字使用 情况二:看左上角显示的是否是master,这是数据库的默认系统库,点选这个改成自己的即可
- tmux多终端工具
在Linux服务器上没有办法像在桌面系统一样开多个终端,所以有时后进行一些操作不是太方便,所以可以使用tmux工具,创建多个终端. 这里仅仅是简单的介绍一下如何创建多个终端和进行多个终端之间切换,tm ...
- java中高级开发知识准备要点
转载来源:https://www.cnblogs.com/JavaArchitect/p/10011253.html 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实 ...
- ping局域网主机得到外网IP或另一网段IP
症状::两个笔记本连接到同一个路由器上, 一个ip是 192.168.1.100,主机名是Lenovo-A, 另一个是192.168.1.109,主机名是Lenovo-B 在Lenovo-A 上pin ...
- python常用模块---collections、time、random、os、sys、序列号模块
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- 第一天学习如何使用markdown写日志,一起来看看成果吧!
目录 一级标题 二级标题 一级标题 二级标题 ==黄色== one two three one two three 性别 年龄 男 150 H~2~o hello markdown hello mar ...
- Linux常用命令操作文档
Ls命令:列出目录内容 选项 长选项 含义 -a --all 列出所有文件,包括隐藏的文件 -d --directory 指定一个目录 -F --classify 在每个列出的名字后面加上类型指示符( ...
- centos7解决ssh登录速度慢的问题
先备份/etc/ssh/sshd_config,备份命令为 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak 1.su ...