welleyth

612. C Full

Mar 21st, 2022
1,237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6. #define int long long
  7. #define pb push_back
  8. #define mp make_pair
  9.  
  10. #pragma GCC optimize("Ofast")
  11. #pragma GCC optimize("unroll-loops")
  12. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
  13. #pragma GCC target("avx,avx2")
  14.  
  15. constexpr int INF = (int)1e9;
  16. constexpr int N = (int)1e3 + 11;
  17. constexpr int MAXN = (int)2e6 + 11;
  18. constexpr int md = (int)1e9+7;
  19.  
  20. void add(int& a,int b){
  21.     a += b;
  22.     if(a >= md) a -= md;
  23. }
  24. void sub(int& a,int b){
  25.     a -= b;
  26.     if(a < 0) a += md;
  27. }
  28.  
  29. int pw[MAXN];
  30. int cnt[MAXN];
  31. int sum[MAXN];
  32. int subs[MAXN];
  33. bool prime[MAXN];
  34. int mobious[MAXN];
  35. int lw[MAXN];
  36. int c[MAXN];
  37. bool used[MAXN];
  38. int answer = 0;
  39. vector<pair<int,int>> PrimeDivs;
  40. //vector<int> divs[MAXN];
  41.  
  42. void rec(int pos,int t,vector<int>& v){
  43.     if(pos == PrimeDivs.size()){
  44.         v.pb(t);
  45.         return;
  46.     }
  47.     rec(pos+1,t,v);
  48.     for(int i = 0; i < PrimeDivs[pos].second; i++){
  49.         t *= PrimeDivs[pos].first;
  50.         rec(pos+1,t,v);
  51.     }
  52.     return;
  53. }
  54.  
  55. vector<int> getDivs(int x){
  56. //    if(!divs[x].empty())
  57. //        return;
  58.     map<int,int> cnt;
  59.     int t = x;
  60.     while(t > 1){
  61.         cnt[lw[t]]++;
  62.         t /= lw[t];
  63.     }
  64.     PrimeDivs.clear();
  65.     for(auto& x : cnt)
  66.         PrimeDivs.pb(x);
  67.     vector<int> v;
  68.     rec(0,1,v);
  69.     return v;
  70. }
  71.  
  72. void updateC(int x){
  73.     if(used[x])
  74.         return;
  75.     vector<int> divs = getDivs(x);
  76.     for(auto& j : divs){
  77. //        cout << "div " << x << " " << j << "\n";
  78.         c[x] += j*mobious[x/j];
  79.     }
  80. //    cerr << "C " << x << " " << c[x] << "\n";
  81.     used[x] = true;
  82.     return;
  83. }
  84.  
  85. void ADD(int a){
  86.     vector<int> divs = getDivs(a);
  87.     for(auto& i : divs){
  88.         int x = i;
  89. //        cerr << "div " << a << " " << x << "\n";
  90.         updateC(x);
  91.         add(answer,c[x]*pw[cnt[x]]%md);
  92.         cnt[x]++;
  93.     }
  94. }
  95.  
  96. void DEL(int a){
  97.     vector<int> divs = getDivs(a);
  98.     for(auto& i : divs){
  99.         int x = i;
  100.         updateC(x);
  101.         cnt[x]--;
  102.         sub(answer,c[x]*pw[cnt[x]]%md);
  103.     }
  104. }
  105.  
  106. void solve(){
  107.     pw[0] = 1;
  108.     pw[1] = 2;
  109.     for(int i = 2; i < MAXN; i++){
  110.         pw[i] = (pw[i-1]*2)%md;
  111.     }
  112.     mobious[1] = 1;
  113.     for(int i = 2; i < MAXN; i++)
  114.         prime[i] = 1, mobious[i] = 1, lw[i] = INF;
  115.     for(int i = 2; i < MAXN; i++){
  116.         if(!prime[i])
  117.             continue;
  118.         lw[i] = i;
  119.         for(int j = i+i; j < MAXN; j+=i){
  120.             lw[j] = min(lw[j],i);
  121.             prime[j] = false;
  122.         }
  123.     }
  124.  
  125.     for(int i = 2; i < MAXN; i++){
  126.         int t = i;
  127.         int p = 0;
  128.         set<int> st;
  129.         while(t > 1){
  130. //            cerr << t << "\n";
  131.             if(st.count(lw[t])){
  132.                 mobious[i] = 0;
  133.                 break;
  134.             }
  135.             st.insert(lw[t]);
  136.             t /= lw[t];
  137.             p ^= 1;
  138.         }
  139. //        rec(i,0);
  140.         if(mobious[i] == 0)
  141.             continue;
  142.         if(p == 0)
  143.             mobious[i] = 1;
  144.         else
  145.             mobious[i] = -1;
  146.     }
  147.  
  148. //    for(int i = 1; i < 10; i++)
  149. //        cerr << mobious[i] << "\n";
  150. //    return;
  151.  
  152. //    for(int i = 1; i < MAXN; i++){
  153. //
  154. //    }
  155.  
  156. //    getDivs(1);
  157. //    for(auto& x : divs[1])
  158. //        cout << x << " ";
  159. //
  160. //    return;
  161.  
  162.     int n,q;
  163.     cin >> n >> q;
  164.  
  165.     for(int i = 0; i < n; i++){
  166.         int a;
  167.         cin >> a;
  168.         ADD(a);
  169.     }
  170.     cout << answer << "\n";
  171.     while(q--){
  172.         int tp,x;
  173.         cin >> tp >> x;
  174.         if(tp == 2)
  175.             DEL(x);
  176.         else
  177.             ADD(x);
  178.         cout << answer << "\n";
  179.     }
  180.  
  181.     return;
  182. }
  183. signed main(){
  184.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  185.     int tests = 1;
  186. //    cin >> tests;
  187.     while(tests--){
  188.         solve();
  189.     }
  190. }
  191. /**
  192.  
  193. 1 -1 -1 0 -1 1 -1 0 0
  194.  
  195. d[1] d[2] d[3] d[4] d[5] d[6] d[7] d[8] d[9] d[10] d[11]
  196.  
  197. 1*(d[1]-d[2]-d[3]-d[5]+d[6]-d[7])
  198. 2*(d[2]-d[4]-d[6]-d[10]+d[12]-d[14])
  199.  
  200. 3*(d[3]-d[6]-d[9]-d[15]+d[18]-d[21])
  201. 4*(d[
  202.  
  203. (pw[i-1]-1)*c[i]
  204. (pw[i]-1)*c[i]
  205. c[i]*(pw[i]-1-(pw[i-1]-1)) = c[i]*(pw[i]-1-pw[i-1]+1) = c[i]*(pw[i]-pw[i-1]) = c[i]*pw[i-1]
  206.  
  207. **/
  208.  
Advertisement
Add Comment
Please, Sign In to add comment