Monday, March 16, 2020

[Codeforces] E. Mike and Foam

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. Mike and Foam
Source            : Codeforces
Category          : Number Theory
Algorithm         : Mobius Function
Verdict           : Accepted
Tutorial : https://artofproblemsolving.com/wiki/index.php/Mobius_function

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

No comments:

Post a Comment

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