Advertisement
RaFiN_

how many pairs whose gcd is 1 cf 547c

Aug 14th, 2019
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. /* how many pairs whose gcd is 1 */
  2.  
  3. int arr[MAX],prime[MAX],p,e[MAX];vi v[MAX];ll ans;int exist[MAX];ll res[MAX],pes[MAX];int len,jk;
  4.  
  5. void sieve(int n){
  6.     double z = sqrt(n);
  7.     for(ll i = 3;i<=z;i+=2){
  8.         if(!arr[i])
  9.         for(ll j = i*i;j<=n;j+=i+i){
  10.             arr[j] = 1;
  11.         }
  12.     }
  13.     prime[p++] = 2;
  14.     for(int i = 3;i<=n;i+=2)if(!arr[i])prime[p++] = i;
  15. }
  16.  
  17. void pre(){
  18.     for(int i = 0;i<p;i++){
  19.         for(int j = prime[i];j<MAX;j+=prime[i]){
  20.             v[j].pb(prime[i]);
  21.         }
  22.     }
  23.     e[1] = 1;
  24.     for(int i = 2;i<MAX;i++){
  25.         if((int)v[i].size()&1)e[i] = -1;
  26.         else e[i] = 1;
  27.     }
  28.    for(ll i = 2;i<MAX;i++){
  29.         ll x = i*i;
  30.         for(ll j = x;j<MAX;j+=x)e[j] = 0;
  31.     }
  32. }
  33.  
  34. void Div(int pos,int pk,ll rr = 1){
  35.     if(pos==len){
  36.         ll z = res[rr];
  37.         z = (z*(z-1))/2;
  38.         ans -= (e[rr] *  z);
  39.         res[rr]+=pk;
  40.         z = res[rr];
  41.         z = (z*(z-1))/2;
  42.         ans += (e[rr] * z);
  43.         return ;
  44.  
  45.     }
  46.     Div(pos+1,pk,rr * v[jk][pos]);
  47.     Div(pos+1,pk,rr);
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53.     booster()
  54.     //read("input.txt");
  55.     sieve(MAX);
  56.     pre();
  57.  
  58.     int n,q;
  59.     cin>>n>>q;
  60.     for(int i = 1;i<=n;i++){
  61.         cin>>arr[i];
  62.     }
  63.     for(int i = 1;i<=q;i++){
  64.         int a;
  65.         cin>>a;
  66.         len = v[arr[a]].size();
  67.         jk = arr[a];
  68.         if(exist[a]){
  69.             Div(0,-1);
  70.         }
  71.         else {
  72.             Div(0,1);
  73.         }
  74.         exist[a] = 1 - exist[a];
  75.         cout<< ans<<endl;
  76.     }
  77.  
  78.  
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement