Saturday, April 4, 2020

[Codeforces] E. Mike and Foam

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. Mike and Foam
Source            : Codeforces
Category          : Number Theroy
Algorithm         : Mobius Function 
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 5e5 + 6;  
  6.   
  7. int sp[maxn];  
  8. vector <int> divisor[maxn];  
  9.   
  10. void seive()  
  11. {  
  12.       for (int i = 2; i < maxn; i++) sp[i] = i;  
  13.       for (int i = 2; i < maxn; i++)  
  14.       {  
  15.             for (int j = 1; 1LL * i * j < maxn; j++)  
  16.             {  
  17.                   sp[i * j] = min(sp[i * j], sp[i]);  
  18.                   divisor[i * j].push_back(i);  
  19.             }  
  20.       }  
  21. }  
  22.   
  23. signed main()  
  24. {  
  25.       ios_base::sync_with_stdio(false);  
  26.       cin.tie(nullptr);  
  27.   
  28.       #ifndef ONLINE_JUDGE  
  29.             freopen("in.txt""r", stdin);  
  30.       #endif // ONLINE_JUDGE  
  31.   
  32.       seive();  
  33.       int n, q;  
  34.       cin >> n >> q;  
  35.       vector <int> arr(n + 1);  
  36.       for (int i = 1; i <= n; i++) cin >> arr[i];  
  37.       vector <int> in_self(n + 1);  
  38.       int in_self_cnt = 0;  
  39.       vector <int> divi(maxn);  
  40.       auto get = [&](vector <int> &vec)  
  41.       {  
  42.             int n = vec.size();  
  43.             long long coprime = 0;  
  44.             for (int mask = 0; mask < (1 << n); mask++)  
  45.             {  
  46.                   long long d = 1;  
  47.                   int bitCnt = 0;  
  48.                   for (int i = 0; i < n; i++)  
  49.                   {  
  50.                         if ((mask >> i) & 1)  
  51.                         {  
  52.                               d *= vec[i];  
  53.                               bitCnt++;  
  54.                         }  
  55.                   }  
  56.                   if (bitCnt & 1) coprime += divi[d];  
  57.                   else coprime -= divi[d];  
  58.             }  
  59.             return coprime;  
  60.       };  
  61.       long long ans = 0;  
  62.       while (q--)  
  63.       {  
  64.             int pos;  
  65.             cin >> pos;  
  66.             vector <int> prime_factors;  
  67.             int num = arr[pos];  
  68.             while (num > 1)  
  69.             {  
  70.                   int x = sp[num];  
  71.                   prime_factors.push_back(x);  
  72.                   while (num % x == 0) num /= x;  
  73.             }  
  74.             sort(prime_factors.begin(), prime_factors.end());  
  75.             num = arr[pos];  
  76.             if (in_self[pos])  
  77.             {  
  78.                   for (int d : divisor[num]) divi[d]--;  
  79.                   in_self[pos] = 0;  
  80.                   in_self_cnt--;  
  81.                   ans -= in_self_cnt - get(prime_factors);  
  82.             }  
  83.             else  
  84.             {  
  85.                   ans += in_self_cnt - get(prime_factors);  
  86.                   for (int d : divisor[num]) divi[d]++;  
  87.                   in_self[pos] = 1;  
  88.                   in_self_cnt++;  
  89.             }  
  90.             cout << ans << '\n';  
  91.       }  
  92. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.