welleyth

612. C

Mar 21st, 2022 (edited)
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 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)3000 + 11;
  18. constexpr int md = (int)1e9+7;
  19.  
  20. vector<pair<int,int>> PrimeDivs[MAXN];
  21. vector<int> divs[MAXN];
  22.  
  23. void rec(int i,int pos,int t = 1){
  24.     if(pos >= PrimeDivs[i].size()){
  25.         divs[i].pb(t);
  26.         return;
  27.     }
  28.     rec(i,pos+1,t);
  29.     for(int U = 1; U <= PrimeDivs[i][pos].second; U++){
  30.         t *= PrimeDivs[i][pos].first;
  31.         rec(i,pos+1,t);
  32.     }
  33.     return;
  34. }
  35.  
  36. void add(int& a,int b){
  37.     a += b;
  38.     if(a >= md) a -= md;
  39. }
  40. void sub(int& a,int b){
  41.     a -= b;
  42.     if(a < 0) a += md;
  43. }
  44.  
  45. int pw[MAXN];
  46. int cnt[MAXN];
  47. int sum[MAXN];
  48. int subs[MAXN];
  49. bool prime[MAXN];
  50. int mobious[MAXN];
  51.  
  52. void ADD(int a){
  53.     for(auto& x : divs[a])
  54.         cnt[x]++;
  55. }
  56.  
  57. void DEL(int a){
  58.     for(auto& x : divs[a])
  59.         cnt[x]--;
  60. }
  61.  
  62. int get(){
  63.     int ans = 0;
  64.     for(int g = 1; g < MAXN; g++){
  65.         int cur = 0;
  66.         for(int i = g; i < MAXN; i += g){
  67.             if(mobious[i/g] == 1)
  68.                 add(cur,pw[cnt[i]]-1);
  69.             else if(mobious[i/g] == -1)
  70.                 sub(cur,pw[cnt[i]]-1);
  71.         }
  72.         ans = (ans + g*cur)%md;
  73.     }
  74.     return ans%md;
  75. }
  76.  
  77. void solve(){
  78.     pw[0] = 1;
  79.     pw[1] = 2;
  80.     for(int i = 2; i < MAXN; i++){
  81.         pw[i] = (pw[i-1]*2)%md;
  82.     }
  83.     mobious[1] = 1;
  84.     for(int i = 2; i < MAXN; i++)
  85.         prime[i] = 1, mobious[i] = 1;
  86.     for(int i = 2; i < MAXN; i++){
  87.         if(!prime[i])
  88.             continue;
  89.         for(int j = i; j < MAXN; j+=i){
  90.             int t = j;
  91.             int cnt = 0;
  92.             while(t % i == 0){
  93.                 t /= i;
  94.                 cnt++;
  95.             }
  96.             sum[j] += cnt;
  97.             if(cnt > 1)
  98.                 mobious[j] = 0;
  99.             PrimeDivs[j].pb(mp(i,cnt));
  100.             if(i != j)
  101.                 prime[j] = false;
  102.         }
  103.     }
  104.  
  105.     divs[1].pb(1);
  106.  
  107.     for(int i = 2; i < MAXN; i++){
  108.         int t = 1;
  109.         rec(i,0);
  110.         if(mobious[i] == 0)
  111.             continue;
  112.         if(sum[i] % 2 == 0)
  113.             mobious[i] = 1;
  114.         else
  115.             mobious[i] = -1;
  116.     }
  117. }
  118.     for(int i = 0; i < 20; i++){
  119.         cout << mobious[i] << " ";
  120.     }
  121.     cout << "\n";
  122.     return;
  123.  
  124. //    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
  125.  
  126.     /// PRECALCED divs
  127.  
  128.     int n,q;
  129.     cin >> n >> q;
  130.  
  131.     for(int i = 0; i < n; i++){
  132.         int x;
  133.         cin >> x;
  134.         ADD(x);
  135.     }
  136. //    return;
  137.  
  138.     cout << get() << "\n";
  139.  
  140.     for(int i = 0; i < q; i++){
  141.         int tp,x;
  142.         cin >> tp >> x;
  143.         if(tp == 1)
  144.             ADD(x);
  145.         else
  146.             DEL(x);
  147.         cout << get() << "\n";
  148.     }
  149.  
  150.     return;
  151. }
  152. signed main(){
  153.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  154.     int tests = 1;
  155. //    cin >> tests;
  156.     while(tests--){
  157.         solve();
  158.     }
  159. }
  160. /**
  161.  
  162. 1 -1 -1 0 -1 1 -1
  163.  
  164. d[1] d[2] d[3] d[4] d[5]
  165.  
  166. 1*(d[1]
  167.  
  168. **/
  169.  
Add Comment
Please, Sign In to add comment