Bitwise Operators_
Bitwise Operators_
xor_all ^= i; }
} }
} if (n % 4 == 1) return 1;
} return 0;
int max = a ^ ((a ^ b) & -(a < b)); Maximum XOR Subarray:
int min = b ^ ((a ^ b) & -(a < b)); int prefix_xor = 0, max_xor = 0;
} diff[L] += val;
vector<vector<int>>& matrix) { }
// Create a prefix sum matrix with the same dimensions vector<int> getUpdatedArray(const vector<int>& diff) {
} a = a % m;
while (b > 0) {
if (x1 > 0 && y1 > 0) total += prefix[x1 - 1][y1 - 1]; //Fermat's Little Theorem and Modular Inverse
vector<int> initializeDifferenceArray(const vector<int>& arr) { vector<long long> fact(MAX_A + 1), inv(MAX_A + 1);
int n = arr.size();
// Function to compute modular exponentiation
long long mod_exp(long long base, long long exp, int mod) { vector<int> primes;
long long result = 1; void sieve(int n = MAXN) {
while (exp > 0) { is_prime[0] = is_prime[1] = false;
if (exp % 2 == 1) result = (result * base) % mod; for (int i = 2; i <= n; i++) {
base = (base * base) % mod; if (is_prime[i]) {
exp /= 2; primes.pb(i);
} for (int j = 2 * i; j <= n; j += i) {
return result; is_prime[j] = false;
} }
// Precompute factorials and modular inverses }
void precompute() { }
fact[0] = 1; }
for (int i = 1; i <= MAX_A; i++) { //segmentedSieve
fact[i] = (fact[i - 1] * i) % MOD; vector<long long> Sieve(long long limit) {
} vector<bool> isPrime(limit + 1, true);
inv[MAX_A] = mod_exp(fact[MAX_A], MOD - 2, MOD); isPrime[0] = isPrime[1] = false;
for (int i = MAX_A - 1; i >= 0; i--) {
inv[i] = (inv[i + 1] * (i + 1)) % MOD;
} for (long long i = 2; i * i <= limit; ++i) {
} if (isPrime[i]) {
// Function to calculate binomial coefficient for (long long j = i * i; j <= limit; j += i) {
(nCr)=n!/(r!*(n-r)!) isPrime[j] = false;
modulo MOD }
long long binomial_coefficient(int n, int r) { }
if (r > n) return 0; }
return fact[n] * inv[r] % MOD * inv[n - r] % MOD; vector<long long> primes;
} for (long long i = 2; i <= limit; ++i) {
if (isPrime[i]) {
// Function to calculate permutation (nPr)=n!/(n-r)! primes.push_back(i);
modulo }
MOD }
long long permutation(int n, int r) { return primes;
if (r > n) return 0; }
return fact[n] * inv[n - r] % MOD; vector<long long> segmentedSieve(long long L, long long U)
} {
long long limit = floor(sqrt(U)) + 1;
//Stars and Bars C(n+k−1,k−1) vector<long long> primes = Sieve(limit);
vector<bool> isPrime(U - L + 1, true);
//Pigeonhole Principle for (long long p : primes)
bool pigeonholeExample(const vector<int>& arr, int m) { {
unordered_map<int, int> freq; long long start = max(p * p, (L + p - 1) / p * p);
for (int x : arr) { for (long long j = start; j <= U; j += p) {
if (++freq[x] > m) { isPrime[j - L] = false;
return true; }
} }
} vector<long long> primeNumbers;
return false; for (long long i = max(L, 2LL); i <= U; ++i)
} {
if (isPrime[i - L]) {
// Sieve of Eratosthenes to find primes up to n primeNumbers.push_back(i);
vector<bool> is_prime(MAXN, true); }
} }
return primeNumbers; }
} return spf;
// Prime Factorization of a number }
vector<int> prime_factors(int n) {
vector<int> factors; vector<int> prime_factorization(int n, const vector<int>& spf)
{
for (int i = 2; i * i <= n; i++) {
vector<int> factors;
while (n % i == 0) {
while (n != 1) {
factors.push_back(i);
factors.push_back(spf[n]);
n /= i;
n /= spf[n];
}
}
}
return factors;
if (n > 1) factors.push_back(n);
}
return factors;
// Divisors of a number
}
vector<int> divisors(int n) {
//The least prime factor (LPF) of a number n is the
vector<int> divs;
smallest
for (int i = 1; i * i <= n; i++) {
prime number that divides n without a remainder
if (n % i == 0) {
vector<int> leastPrimeFactor(int n) {
divs.push_back(i);
vector<int> lpf(n + 1, 0);
if (i != n / i) divs.push_back(n / i);
lpf[1] = 1;
}
}
for (int i = 2; i <= n; i++) {
return divs;
if (lpf[i] == 0) {
}
lpf[i] = i;
// Euler's Totient Function (Phi function)
for (int j = i * 2; j <= n; j += i) {
int euler_totient(int n) {
if (lpf[j] == 0) {
int result = n;
lpf[j] = i;
for (int i = 2; i * i <= n; i++) {
}
if (n % i == 0) {
}
while (n % i == 0) n /= i;
}
result -= result / i;
}
}
}
return lpf;
if (n > 1) result -= result / n;
}
return result;
//Prime Factorization using Sieve O(log n) for multiple
}
queries
//GCD
vector<int> sieve_and_spf(int limit) {
int gcd(int a, int b) {
vector<int> spf(limit + 1);
while (b != 0) {
for (int i = 0; i <= limit; i++) {
int temp = b;
spf[i] = i;
b = a % b;
}
a = temp;
}
return a;
for (int i = 2; i * i <= limit; i++) {
}
if (spf[i] == i) {
//STL gcd
for (int j = i * i; j <= limit; j += i) {
__gcd(a,b)
if (spf[j] == j) {
//LCM
spf[j] = i;
int lcm(int a, int b) {
}
return (a * b) / gcd(a, b);
}
}
// Extended Euclidean Algorithm to find gcd and vector<vector<int>> result = {{1, 0}, {0, 1}};
coefficients while (n) {
int extended_gcd(int a, int b, int &x, int &y) { if (n % 2) result = matrix_mult(result, A);
if (b == 0) { A = matrix_mult(A, A);
x = 1; n /= 2;
y = 0; }
return a; return result;
} }
int gcd = extended_gcd(b, a % b, x, y);
int temp = x; int fib(int n) {
x = y; if (n == 0) return 0;
y = temp - (a / b) * y; vector<vector<int>> F = {{1, 1}, {1, 0}};
return gcd; F = matrix_pow(F, n - 1);
} return F[0][0];
// Chinese Remainder Theorem (CRT) }
int mod_inverse(int a, int m) { //math
int x, y; //Matrix Exponentiation
int g = extended_gcd(a, m, x, y); vector<vector<long long>> mat_mult(vector<vector<long
if (g != 1) return -1; // No solution long>>& A, vector<vector<long long>>& B, int mod) {
return (x % m + m) % m; int n = A.size();
} vector<vector<long long>> result(n, vector<long long>(n,
0));
int chinese_remainder_theorem(vector<int> &a, vector<int>
for (int i = 0; i < n; i++) {
&m) {
for (int j = 0; j < n; j++) {
int prod = 1;
for (int k = 0; k < n; k++) {
for (int i = 0; i < m.size(); i++) prod *= m[i];
result[i][j] = (result[i][j] + A[i][k] * B[k][j]) % mod;
}
int result = 0;
}
for (int i = 0; i < m.size(); i++) {
}
int pp = prod / m[i];
return result;
result += a[i] * mod_inverse(pp, m[i]) * pp;
}
result %= prod;
}
vector<vector<long long>> mat_pow(vector<vector<long
return result;
long>>& A, int exp, int mod) {
}
int n = A.size();
// Fibonacci Numbers using Matrix Exponentiation
vector<vector<long long>> result(n, vector<long long>(n,
0));
vector<vector<int>> matrix_mult(vector<vector<int>> &A,
for (int i = 0; i < n; i++) result[i][i] = 1;
vector<vector<int>> &B) {
while (exp > 0) {
vector<vector<int>> C(2, vector<int>(2));
if (exp % 2 == 1) result = mat_mult(result, A, mod);
for (int i = 0; i < 2; i++) {
A = mat_mult(A, A, mod);
for (int j = 0; j < 2; j++) {
exp /= 2;
C[i][j] = 0;
}
for (int k = 0; k < 2; k++) {
return result;
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
return C;
}