Topic Link: POINT here!!!
Test instructions
Enter N (n<=2e5), Q (q<=2e5). followed by the input n number A1~an (AI<=5E5). Given an empty collection.
For each q, enter X, if A[X] is not inside the collection, insert a[x], and ask how many pairs of coprime are present in the set;
If A[X] is inside the collection, the a[x] is deleted, and the number of coprime to the current set is calculated.
Exercises
1, the elements of all the number of factors to find out. (Maximum of 6)
2, if the a[x] inserted into, we examine the a[x] of the factor can be composed of the number of what, all +1.
For example a[x]=12, we will be 2, 3, 6 all +1.
3, we can then use the principle of tolerance to find out how many numbers and X do not coprime.
4, delete is the inverse process, we also have to pay attention to the situation of a[x]=1 alone can be handled.
Code:
#include <cstdio> #include <cstring> #include <iostream> #include <sstream> #include < algorithm> #include <vector> #include <bitset> #include <set> #include <queue> #include < stack> #include <map> #include <cstdlib> #include <cmath> #define PI 2*asin (1.0) #define LL Long long# Define PB push_back#define pa pair<int,int> #define CLR (A, B) memset (A,b,sizeof (a)) #define Lson lr<<1,l,mid# Define Rson Lr<<1|1,mid+1,r#define Bug (x) printf ("%d++++++++++++++++++++%d\n", x,x) #define Key_value Ch[ch[root ][1]][0]c:\program files\git\binconst ll MOD = 1e9+7;const ll N = 5e5+15;const int MAXN = 5e5+15;const int letter = 130;c Onst LL INF = 1e18;const double Pi=acos ( -1.0); const double eps=1e-10;using namespace Std;inline int read () {int x=0,f=1 ; Char Ch=getchar (); while (ch< ' 0 ' | | Ch> ' 9 ') {if (ch== '-') F=-1;ch=getchar ();} while (ch>= ' 0 ' &&ch<= ' 9 ') {x=x*10+ch-' 0 '; Ch=getchar ();} return x*f;} int N,q,a[maxn],ps[maxn];inT dis[n],vis[n],prime[50000],cnt=0;vector<int>g[maxn];inline void Init () {vis[1]=1; for (int i=2;i<n;i++) {if (!vis[i]) prime[++cnt]=i; for (int j=1;j<=cnt&&prime[j]*i<n;j++) {vis[i*prime[j]]=1; if (i%prime[j]==0) break; }}}int Main () {int x; Init (); scanf ("%d%d", &n,&q); for (int i=1;i<=n;i++) {scanf ("%d", &x); Ps[i]=x; if (x==1) {G[I].PB (1); Continue } for (int j=1;prime[j]*prime[j]<=x;j++) {if (x%prime[j]==0) {G[I].PB (prime[j]); while (x%prime[j]==0) x/=prime[j]; }} if (X!=1) G[I].PB (x); } LL sum=0,ans=1,pp; int cc,cnt=0; while (q--) {scanf ("%d", &x); if (ps[x]==1) {if (!a[x]) sum+=1ll*cnt,cnt++; if (A[x]) sum-=1ll* (cnt-1), cnt--; } else if (!a[x]) {int p=g[x].size (); Pp=0; for (iNT i=1;i< (1<<p); i++) {ans=1,cc=0; for (int j=0;j<p;j++) {if (i& (1<<j)) {ans*=g[x][j]; cc++; }} if (cc&1) Pp+=dis[ans]; else Pp-=dis[ans]; dis[ans]++; } sum+=1ll* (CNT-PP); cnt++; } else {int p=g[x].size (); Pp=0; for (int i=1;i< (1<<p); i++) {ans=1,cc=0; for (int j=0;j<p;j++) {if (i& (1<<j)) {ans*=g[x][j]; cc++; }} if (cc&1) Pp+=1ll*dis[ans]; else Pp-=1ll*dis[ans]; dis[ans]--; } sum-=1ll* (CNT-PP); cnt--; } A[x]=!a[x]; printf ("%i64d\n", sum); } return 0;} /**/
Codeforces Round #305 (Div. 1) C. Mike and Foam (prime + tolerance)