#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e7 + 7;
vector<bool> P;//czy pierwsza
vector<int> primes;//liczby pierwsze
bool used[MAXN];
int n, q, x;
void sito(){
for(int i = 2; i <= n; i++){
if(!P[i]){
primes.push_back(i);
for(int j = i * i; j <= n; j += i) P[j] = 1;
}
}
}
int main(){
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> q;
P.assign(n+1, 0);
sito();
vector<vector<int>> cnt(primes.size(), vector<int>(n, 0));//dla pozycji startowej i danego p
vector<int> cntRes(n+1, 0);//ile par (p, x) ma taki wynik
int maxi = 0;
int cntS = 0;
while(q--){
cin >> x;
if(used[x]){//usuwamy
used[x] = false;
cntS--;
for(int i = 0; i < primes.size(); i++){
int p = primes[i];
cntRes[cnt[i][x % p]]--;//o jedna mniej pare (p, x)
if(cntRes[cnt[i][x % p]] == 0 && cnt[i][x % p] == maxi) maxi--;//ta para byla maksimum i nie ma innej - zmniejszamy maxi
cnt[i][x%p]--;//zmniejszamy ile jest w tym ciagu
cntRes[cnt[i][x % p]]++;//dodajemy pare do wynikow
}
}
else{
used[x] = true;
cntS++;
for(int i = 0; i < primes.size(); i++){
int p = primes[i];
cntRes[cnt[i][x % p]]--;
cnt[i][x%p]++;
cntRes[cnt[i][x%p]]++;
maxi = max(maxi, cnt[i][x%p]);
}
}
if(n == 1) cout << cntS << "\n";
else cout << maxi << "\n";
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <bits/stdc++.h> using namespace std; const int MAXN = 1e7 + 7; vector<bool> P;//czy pierwsza vector<int> primes;//liczby pierwsze bool used[MAXN]; int n, q, x; void sito(){ for(int i = 2; i <= n; i++){ if(!P[i]){ primes.push_back(i); for(int j = i * i; j <= n; j += i) P[j] = 1; } } } int main(){ ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n >> q; P.assign(n+1, 0); sito(); vector<vector<int>> cnt(primes.size(), vector<int>(n, 0));//dla pozycji startowej i danego p vector<int> cntRes(n+1, 0);//ile par (p, x) ma taki wynik int maxi = 0; int cntS = 0; while(q--){ cin >> x; if(used[x]){//usuwamy used[x] = false; cntS--; for(int i = 0; i < primes.size(); i++){ int p = primes[i]; cntRes[cnt[i][x % p]]--;//o jedna mniej pare (p, x) if(cntRes[cnt[i][x % p]] == 0 && cnt[i][x % p] == maxi) maxi--;//ta para byla maksimum i nie ma innej - zmniejszamy maxi cnt[i][x%p]--;//zmniejszamy ile jest w tym ciagu cntRes[cnt[i][x % p]]++;//dodajemy pare do wynikow } } else{ used[x] = true; cntS++; for(int i = 0; i < primes.size(); i++){ int p = primes[i]; cntRes[cnt[i][x % p]]--; cnt[i][x%p]++; cntRes[cnt[i][x%p]]++; maxi = max(maxi, cnt[i][x%p]); } } if(n == 1) cout << cntS << "\n"; else cout << maxi << "\n"; } } |
English