Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* how many pairs whose gcd is 1 */
- int arr[MAX],prime[MAX],p,e[MAX];vi v[MAX];ll ans;int exist[MAX];ll res[MAX],pes[MAX];int len,jk;
- void sieve(int n){
- double z = sqrt(n);
- for(ll i = 3;i<=z;i+=2){
- if(!arr[i])
- for(ll j = i*i;j<=n;j+=i+i){
- arr[j] = 1;
- }
- }
- prime[p++] = 2;
- for(int i = 3;i<=n;i+=2)if(!arr[i])prime[p++] = i;
- }
- void pre(){
- for(int i = 0;i<p;i++){
- for(int j = prime[i];j<MAX;j+=prime[i]){
- v[j].pb(prime[i]);
- }
- }
- e[1] = 1;
- for(int i = 2;i<MAX;i++){
- if((int)v[i].size()&1)e[i] = -1;
- else e[i] = 1;
- }
- for(ll i = 2;i<MAX;i++){
- ll x = i*i;
- for(ll j = x;j<MAX;j+=x)e[j] = 0;
- }
- }
- void Div(int pos,int pk,ll rr = 1){
- if(pos==len){
- ll z = res[rr];
- z = (z*(z-1))/2;
- ans -= (e[rr] * z);
- res[rr]+=pk;
- z = res[rr];
- z = (z*(z-1))/2;
- ans += (e[rr] * z);
- return ;
- }
- Div(pos+1,pk,rr * v[jk][pos]);
- Div(pos+1,pk,rr);
- }
- int main()
- {
- booster()
- //read("input.txt");
- sieve(MAX);
- pre();
- int n,q;
- cin>>n>>q;
- for(int i = 1;i<=n;i++){
- cin>>arr[i];
- }
- for(int i = 1;i<=q;i++){
- int a;
- cin>>a;
- len = v[arr[a]].size();
- jk = arr[a];
- if(exist[a]){
- Div(0,-1);
- }
- else {
- Div(0,1);
- }
- exist[a] = 1 - exist[a];
- cout<< ans<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement