Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- #define int long long
- const int MAXN = 3e5 + 10;
- const int MOD = 998244353;
- #define ll __int128
- mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
- int rnd(int x, int y) {
- int u = uniform_int_distribution<int>(x, y)(rng); return u;
- }
- ll read() { int x; cin >> x; return (ll)x; }
- long long bm(long long b, long long p) {
- if(p==0) return 1 % MOD;
- long long r = bm(b, p >> 1);
- if(p&1) return (((r*r) % MOD) * b) % MOD;
- return (r*r) % MOD;
- }
- long long inv(long long b) {
- return bm(b, MOD-2);
- }
- long long f[MAXN];
- long long nCr(int n, int r) {
- long long ans = f[n]; ans *= inv(f[r]); ans %= MOD;
- ans *= inv(f[n-r]); ans %= MOD; return ans;
- }
- long long fib[MAXN], lucas[MAXN];
- void precomp() {
- for(int i=0; i<MAXN; i++) f[i] = (i == 0 ? 1 % MOD : (f[i-1] * i) % MOD);
- lucas[0] = 2;
- lucas[1] = 1;
- for(int i=2; i<MAXN; i++) lucas[i] = (lucas[i-2] + lucas[i-1]) % MOD;
- fib[0] = 0;
- fib[1] = 1;
- for(int i=2; i<MAXN; i++) fib[i] = (fib[i-2] + fib[i-1]) % MOD;
- }
- int fastlog(int x) {
- return (x == 0 ? -1 : 64 - __builtin_clzll(x) - 1);
- }
- void google(int i) { cout << "Case #" << i << ": "; }
- int csb(int l, int r, int k) { // count number of [l, r] such that i & 2^k > 0
- if(l > r) return 0;
- if(l == 0) {
- int s = r / (1ll << (k+1)); // number of complete cycles
- int t = r % (1ll << (k+1));
- int ans = s * (1ll << k);
- ans += (t >= (1ll << k) ? t - (1ll << k) + 1 : 0);
- return ans;
- }
- else return csb(0, r, k) - csb(0, l - 1, k);
- }
- int lis(vector<int> a) {
- int n = a.size();
- int bucket[n+1];
- for(int i=1; i<=n; i++) bucket[i] = 1e18;
- int ans = 1;
- for(int x: a) {
- auto it = lower_bound(bucket + 1, bucket +n +1, x);
- int d = distance(bucket, it);
- ans = max(ans, d);
- bucket[d] = min(bucket[d], x);
- }
- return ans;
- }
- void solve(int tc) {
- int n, m, q;
- cin >> n >> m >> q;
- if(m > 10) {
- bool prime[n+1];
- for(int i=1; i<=n; i++) prime[i] = 1;
- prime[1] = 0;
- for(int i=2; i*i<=n; i++) {
- if(prime[i]) {
- for(int j=i*i; j<=n; j+=i) prime[j] = 0;
- }
- }
- vector<int> primes;
- primes.push_back(0);
- for(int i=1; i<=n; i++) if(prime[i]) primes.push_back(i);
- int cnt[n+1];
- for(int i=1; i<=n; i++) cnt[i] = 0;
- int ans = 0;
- for(int i=1; i<=m; i++) {
- for(int j=primes[i]; j<=n; j+=primes[i]) {
- cnt[j]++;
- if(cnt[j] == 1) ans++;
- }
- }
- bool bruh[m+1];
- for(int i=1; i<=m; i++) bruh[i] = 1;
- for(int i=0; i<q; i++) {
- int x;
- cin >> x;
- for(int j=primes[x]; j<=n; j+=primes[x]) {
- if(bruh[x]) {
- cnt[j]--;
- if(cnt[j] == 0) ans--;
- }
- else {
- cnt[j]++;
- if(cnt[j] == 1) ans++;
- }
- }
- bruh[x] ^= 1;
- cout << ans << "\n";
- }
- }
- else {
- bool prime[n+1];
- for(int i=1; i<=n; i++) prime[i] = 1;
- prime[1] = 0;
- for(int i=2; i*i<=n; i++) {
- if(prime[i]) {
- for(int j=i*i; j<=n; j+=i) prime[j] = 0;
- }
- }
- vector<int> primes; // 0- based this time
- for(int i=1; i<=n; i++) if(prime[i]) primes.push_back(i);
- int ans[(1 << m)];
- for(int i=0; i<(1<<m); i++) ans[i] = 0;
- bitset<1000001> ok[m];
- for(int i=0; i<m; i++) {
- for(int j=1; j<=n; j++) ok[i][j] = 0;
- for(int j=primes[i]; j<=n; j+=primes[i]) ok[i][j] = 1;
- }
- for(int i=0; i<(1<<m); i++) {
- bitset<1000001> overall(0);
- for(int j=0; j<m; j++) {
- if(i & (1<<j)) overall |= ok[j];
- }
- ans[i] = overall.count();
- }
- int cur = (1 << m) - 1;
- for(int i=0; i<q; i++) {
- int x;
- cin >> x;
- cur ^= (1 << (x-1));
- cout << ans[cur] << "\n";
- }
- }
- }
- int32_t main() {
- precomp();
- ios::sync_with_stdio(0); cin.tie(0);
- int t = 1; //cin >> t;
- for(int i=1; i<=t; i++) solve(i);
- }
- // I don't know geometry.
- // Teaming is unfair.
- /*
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement