Advertisement
willy108

brute for food poisoning

Aug 7th, 2022
879
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3. #define int long long
  4. const int MAXN = 3e5 + 10;
  5. const int MOD = 998244353;
  6. #define ll __int128
  7. mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
  8. int rnd(int x, int y) {
  9.   int u = uniform_int_distribution<int>(x, y)(rng); return u;
  10. }
  11. ll read() { int x; cin >> x; return (ll)x; }
  12. long long bm(long long b, long long p) {
  13.   if(p==0) return 1 % MOD;
  14.   long long r = bm(b, p >> 1);
  15.   if(p&1) return (((r*r) % MOD) * b) % MOD;
  16.   return (r*r) % MOD;
  17. }
  18. long long inv(long long b) {
  19.   return bm(b, MOD-2);
  20. }
  21. long long f[MAXN];
  22. long long nCr(int n, int r) {
  23.   long long ans = f[n]; ans *= inv(f[r]); ans %= MOD;
  24.   ans *= inv(f[n-r]); ans %= MOD; return ans;
  25. }
  26. long long fib[MAXN], lucas[MAXN];
  27. void precomp() {
  28.   for(int i=0; i<MAXN; i++) f[i] = (i == 0 ? 1 % MOD : (f[i-1] * i) % MOD);
  29.   lucas[0] = 2;
  30.   lucas[1] = 1;
  31.   for(int i=2; i<MAXN; i++) lucas[i] = (lucas[i-2] + lucas[i-1]) % MOD;
  32.   fib[0] = 0;
  33.   fib[1] = 1;
  34.   for(int i=2; i<MAXN; i++) fib[i] = (fib[i-2] + fib[i-1]) % MOD;
  35. }
  36. int fastlog(int x) {
  37.   return (x == 0 ? -1 : 64 - __builtin_clzll(x) - 1);
  38. }
  39. void google(int i) { cout << "Case #" << i << ": "; }
  40. int csb(int l, int r, int k) { // count number of [l, r] such that i & 2^k > 0
  41.   if(l > r) return 0;
  42.   if(l == 0) {
  43.     int s = r / (1ll << (k+1)); // number of complete cycles
  44.     int t = r % (1ll << (k+1));
  45.     int ans = s * (1ll << k);
  46.     ans += (t >= (1ll << k) ? t - (1ll << k) + 1 : 0);
  47.     return ans;
  48.   }
  49.   else return csb(0, r, k) - csb(0, l - 1, k);
  50. }
  51. int lis(vector<int> a) {
  52.   int n = a.size();
  53.   int bucket[n+1];
  54.   for(int i=1; i<=n; i++) bucket[i] = 1e18;
  55.   int ans = 1;
  56.   for(int x: a) {
  57.     auto it = lower_bound(bucket + 1, bucket +n +1, x);
  58.     int d = distance(bucket, it);
  59.     ans = max(ans, d);
  60.     bucket[d] = min(bucket[d], x);
  61.   }
  62.   return ans;
  63. }
  64. void solve(int tc) {
  65.   int n, m, q;
  66.   cin >> n >> m >> q;
  67.   if(m > 10) {
  68.     bool prime[n+1];
  69.     for(int i=1; i<=n; i++) prime[i] = 1;
  70.     prime[1] = 0;
  71.     for(int i=2; i*i<=n; i++) {
  72.       if(prime[i]) {
  73.         for(int j=i*i; j<=n; j+=i) prime[j] = 0;
  74.       }
  75.     }
  76.     vector<int> primes;
  77.     primes.push_back(0);
  78.     for(int i=1; i<=n; i++) if(prime[i]) primes.push_back(i);
  79.     int cnt[n+1];
  80.     for(int i=1; i<=n; i++) cnt[i] = 0;
  81.     int ans = 0;
  82.     for(int i=1; i<=m; i++) {
  83.       for(int j=primes[i]; j<=n; j+=primes[i]) {
  84.         cnt[j]++;
  85.         if(cnt[j] == 1) ans++;
  86.       }
  87.     }
  88.     bool bruh[m+1];
  89.     for(int i=1; i<=m; i++) bruh[i] = 1;
  90.     for(int i=0; i<q; i++) {
  91.       int x;
  92.       cin >> x;
  93.       for(int j=primes[x]; j<=n; j+=primes[x]) {
  94.         if(bruh[x]) {
  95.           cnt[j]--;
  96.           if(cnt[j] == 0) ans--;
  97.         }
  98.         else {
  99.           cnt[j]++;
  100.           if(cnt[j] == 1) ans++;
  101.         }
  102.       }
  103.       bruh[x] ^= 1;
  104.       cout << ans << "\n";
  105.     }
  106.   }
  107.   else {
  108.     bool prime[n+1];
  109.     for(int i=1; i<=n; i++) prime[i] = 1;
  110.     prime[1] = 0;
  111.     for(int i=2; i*i<=n; i++) {
  112.       if(prime[i]) {
  113.         for(int j=i*i; j<=n; j+=i) prime[j] = 0;
  114.       }
  115.     }
  116.     vector<int> primes; // 0- based this time
  117.     for(int i=1; i<=n; i++) if(prime[i]) primes.push_back(i);
  118.     int ans[(1 << m)];
  119.     for(int i=0; i<(1<<m); i++) ans[i] = 0;
  120.     bitset<1000001> ok[m];
  121.     for(int i=0; i<m; i++) {
  122.       for(int j=1; j<=n; j++) ok[i][j] = 0;
  123.       for(int j=primes[i]; j<=n; j+=primes[i]) ok[i][j] = 1;
  124.     }
  125.  
  126.     for(int i=0; i<(1<<m); i++) {
  127.       bitset<1000001> overall(0);
  128.       for(int j=0; j<m; j++) {
  129.         if(i & (1<<j)) overall |= ok[j];
  130.       }
  131.       ans[i] = overall.count();
  132.     }
  133.     int cur = (1 << m) - 1;
  134.     for(int i=0; i<q; i++) {
  135.       int x;
  136.       cin >> x;
  137.       cur ^= (1 << (x-1));
  138.       cout << ans[cur] << "\n";
  139.     }
  140.   }
  141.  
  142. }
  143. int32_t main() {
  144.   precomp();
  145.   ios::sync_with_stdio(0); cin.tie(0);
  146.   int t = 1; //cin >> t;
  147.   for(int i=1; i<=t; i++) solve(i);
  148. }
  149. // I don't know geometry.
  150. // Teaming is unfair.
  151.  
  152. /*
  153.  
  154. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement