51nod1439 互质对

1439 互质对

基准时间限制:2 秒 空间限制:131072 KB

有n个数字,a[1],a[2],…,a[n]。有一个集合,刚开始集合为空。然后有一种操作每次向集合中加入一个数字或者删除一个数字。每次操作给出一个下标x(1 ≤ x ≤ n),如果a[x]已经在集合中,那么就删除a[x],否则就加入a[x]。

问每次操作之后集合中互质的数字有多少对。

注意,集合中可以有重复的数字,两个数字不同当且仅当他们的下标不同。

比如a[1]=a[2]=1。那么经过两次操作1,2之后,集合之后存在两个1,里面有一对互质。

Input

单组测试数据。
第一行包含两个整数n 和 q (1 ≤ n, q ≤ 2 × 10^5)。表示数字的种类和查询数目。
第二行有n个以空格分开的整数a[1],a[2],…,a[n] (1 ≤ a[i] ≤ 5 × 10^5),分别表示n个数字。
接下来q行,每行一个整数x(1 ≤ x ≤ n),表示每次操作的下标。

Output

对于每一个查询,输出当前集合中互质的数字有多少对。

Input示例

样例输入1
5 6
1 2 3 4 6
1
2
3
4
5
1
样例输入2
2 3
1 1
1
2
1

Output示例

样例输出1
0
1
3
5
6
2
样例输出2
0
1
0

题解:这题等价于求一个数和一系列数有几个互质。

我们先想不互质的,不互质的情况是什么,两个数有非1的质因子。

然后就是容斥原理对质因子求个数了。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<vector>
 8 using namespace std;
 9 typedef long long ll;
10 typedef long double ld;
11 typedef pair<int,int> pr;
12 const double pi=acos(-1);
13 #define rep(i,a,n) for(int i=a;i<=n;i++)
14 #define per(i,n,a) for(int i=n;i>=a;i--)
15 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
16 #define clr(a) memset(a,0,sizeof(a))
17 #define pb push_back
18 #define mp make_pair
19 #define fi first
20 #define sc second
21 #define pq priority_queue
22 #define pqb priority_queue <int, vector<int>, less<int> >
23 #define pqs priority_queue <int, vector<int>, greater<int> >
24 #define vec vector
25 ld eps=1e-9;
26 ll pp=1000000007;
27 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
28 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
29 void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
30 //void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
31 int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
32 ll read(){ ll ans=0; char last=‘ ‘,ch=getchar();
33 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar();
34 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar();
35 if(last==‘-‘)ans=-ans; return ans;
36 }
37 const int N=1000000;
38 ll ans;
39 int c[N],zs[N],p[N],f[N],a[N],nu,fl[N];
40 void solve(int i,int k,int f,int t){
41     if (i==0) {
42         if (t==-1) c[k]--;
43         ans+=f*c[k];
44         if (t==1) c[k]++;
45         return ;
46     }
47     solve(i-1,k,f,t);
48     solve(i-1,k*zs[i],-f,t);
49 }
50 int main(){
51     int n=read(),q=read(),need=sqrt(500000);
52     for (int i=1;i<=n;i++) a[i]=read();
53     for (int i=2;i<=need;i++) {
54         if (!f[i]) p[++nu]=i;
55         for (int j=1;j<=nu && i*p[j]<=need;j++){
56             f[i*p[j]]=1;
57             if (i%p[j]==0) break;
58         }
59     }
60     ans=0;
61     while (q--){
62         int x=read(),n=a[x],g=0;
63         for (int i=1;i<=nu;i++){
64             if (n==1) break;
65             if (n%p[i]==0){
66                 zs[++g]=p[i];
67                 while (n%p[i]==0) n/=p[i];
68             }
69         }
70         if (n>1) zs[++g]=n;
71         if (fl[x]) solve(g,1,-1,-1);
72         else solve(g,1,1,1);
73         fl[x]^=1;
74         printf("%lld\n",ans);
75     }
76     return 0;
77 } 

时间: 2024-10-01 05:25:07

51nod1439 互质对的相关文章

NYOJ154 聪明的小珂 【互质】

聪明的小珂 时间限制:1000 ms  |  内存限制:1000 KB 难度:3 描写叙述 小珂是一个爱美的女孩.她有n条新项链.标号从1到n.每一条项链在颜色上都会有一些区别,n条项链依次摆放,围成一个圈.小珂每次都会从上一次选择项链的位置開始数到第k条项链,把这条项链作为今天要带的项链,每次数的方向都是一致的.如今希望你帮小珂计算出一个最大的k,满足k<=n/2的同一时候,使得小珂在接下来的n天中将全部的项链都刚好带了一遍. 比如 n=7.取k=3 天数  项链编号 1           

互质 整除 同余

互质 当(a,b)=1时,称a.b互质(素) 性质: 1.已知(a,c)=1,若a|bc,则a|b:若a|b,c|b,则ac|b 2.p为素数,若p|ab,则p|a或p|b 3.[a,b]*(a,b)=ab 4.(a,b)=(a,b-ac)=(a-bc,b) 5.存在整数x.y,使得ax+by=(a,b) 6.m(a,b)=(ma,mb) 7.若a|m,b|m,则[a,b]|m 8.m[a,b]=[ma,mb] 整除 设a,b为整数,a≠0,若有一整数q,使得b=aq,则称a是b的因数,b为a的

Hello Kiki(中国剩余定理——不互质的情况)

Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 247 Accepted Submission(s): 107   Problem Description One day I was shopping in the supermarket. There was a cashier counting coins serio

HDU5668 Circle 非互质中国剩余定理

分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然不要忘了判无解的情况. 有非常多选手似乎都是一眼标算然后写挂了,对此表示很遗憾,但是此题确实是比较容易写挂的... 注:中国剩余定理 解模线性方程组的时候 有两种情况 1:一种是模数是两辆互质的,这样的题可以用LRJ白书上的模板,俗称CRT1 2:模数存在不互质的,这样的需要用合并方程的做法,俗称C

(hdu step 7.2.2)GCD Again(欧拉函数的简单应用——求[1,n)中与n不互质的元素的个数)

题目: GCD Again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 125 Accepted Submission(s): 84   Problem Description Do you have spent some time to think and try to solve those unsolved problem afte

容斥原理 求M以内有多少个跟N是互质的

开始系统的学习容斥原理!通常我们求1-n中与n互质的数的个数都是用欧拉函数! 但如果n比较大或者是求1-m中与n互质的数的个数等等问题,要想时间效率高的话还是用容斥原理! 本题是求[a,b]中与n互质的数的个数,可以转换成求[1,b]中与n互质的数个数减去[1,a-1]与n互质的数的个数. #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define LL long

51 nod 1439 互质对(Moblus容斥)

1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开始集合为空.然后有一种操作每次向集合中加入一个数字或者删除一个数字.每次操作给出一个下标x(1 ≤ x ≤ n),如果a[x]已经在集合中,那么就删除a[x],否则就加入a[x]. 问每次操作之后集合中互质的数字有多少对. 注意,集合中可以有重复的数字,两个数字不同当且仅当他们的下标不同. 比如a[

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1,m2,m3,...,mk是两两互素的正整数,即gcd(mi,mj)=1,i!=j,i,j=1,2,3,...,k. 则同余方程组: x = a1 (mod n1) x = a2 (mod n2) ... x = ak (mod nk) 模[n1,n2,...nk]有唯一解,即在[n1,n2,...,nk]的意义下,存在唯一的x,满足: x = ai mod [n1,n2,...,nk], i=1,2,3,...,k. 解可以写为这种形式: x = sigma(ai* 

三元环:在数集中求有多少个三元子集中的元素两两互质

2.14在杭二参加集训,校园好美!!!QAQ 杜教在下午为大家做了上午三题的讲解和一些CF杂题的选讲,其中有在图上求所有三元环的算法.这个算法不是很复杂,但还是蛮有趣的啦QWQ 我们已有一些整数,记作a1,a2,...,an.我们希望求出这些数中有多个含有三个元素的子集满足题目的条件,即{ai,aj,ak}中(ai,aj)=1且(ai,ak)=1且(aj,ak)=1. 第一步,建图.将a1,a2,...an分别作为编号为1,2,...,n的点处理,且如果ai和aj互质,那么结点i和结点j之间建立