Overview
Numeric utilities for competitive programming including modular arithmetic with automatic operations, fast exponentiation, and arbitrary precision integers.
Modular Integer (Mint)
A template class for modular arithmetic that handles all operations automatically.
Basic Mint
template < typename Type >
struct Modular {
using T = typename decay < decltype ( Type ::value)>:: type ;
T value;
Modular ();
Modular ( int64_t num );
Modular & operator += ( const Modular & m );
Modular & operator -= ( const Modular & m );
Modular & operator *= ( const Modular & m );
Modular & operator /= ( const Modular & m );
friend Modular operator + ( Modular a , const Modular & b );
friend Modular operator - ( Modular a , const Modular & b );
friend Modular operator * ( Modular a , const Modular & b );
friend Modular operator / ( Modular a , const Modular & b );
Modular operator - () const ;
Modular & operator ++ ();
Modular & operator -- ();
};
const int MOD = 1 e 9 + 7 ;
using Mint = Modular < integral_constant < decay < decltype (MOD)>:: type , MOD >>;
Modular Inverse
template < typename T >
T inverse ( T a , T m );
template < typename Type >
Modular < Type > inverse ( const Modular < Type > & a );
Complexity: O(log m)
Usage Example:
const int MOD = 1 e 9 + 7 ;
using Mint = Modular < integral_constant < int , MOD >>;
Mint a = 5 ;
Mint b = 3 ;
Mint c = a + b; // 8
Mint d = a * b; // 15
Mint e = a / b; // 5 * inverse(3) mod MOD
cout << c << endl; // Automatically applies modulo
Features
operator+
Modular operator+(Modular a, const Modular& b)
Modular addition
operator*
Modular operator*(Modular a, const Modular& b)
Modular multiplication
operator/
Modular operator/(Modular a, const Modular& b)
Modular division (automatically computes inverse)
inverse
Modular inverse(const Modular& a)
Compute modular multiplicative inverse
Compile-time vs Runtime Modulo
Compile-time (recommended):
const int MOD = 1 e 9 + 7 ;
using Mint = Modular < integral_constant < int , MOD >>;
Runtime (variable modulo):
using ModType = int ;
struct VarMod { static ModType value; };
ModType VarMod ::value;
ModType & MOD = VarMod ::value;
using Mint = Modular < VarMod >;
// Set modulo at runtime
MOD = 998244353 ;
Versions Available
Version File Description Compress numeric_mint_compress.cppMinimal implementation Medium numeric_mint_medium.cppBalanced features Full numeric_mint_full.cppAll features included
Fast Power
Computes a^b efficiently using binary exponentiation.
template < typename T , typename U >
T fastpow ( T a , U b );
Base (can be int, Mint, Matrix, etc.)
Exponent (must be non-negative)
Complexity: O(log b)
Usage Example:
// Integer power
int result = fastpow ( 2 , 10 ); // 1024
// Modular power
Mint a = 2 ;
Mint result = fastpow (a, 1000000000 );
// Matrix power
Matrix < int > mat ( n , n );
Matrix < int > result = fastpow (mat, k);
Modular Operations
Basic Modular Operations
template < typename T >
T mod ( T a , T m ); // Always returns positive result
template < typename T >
T add_mod ( T a , T b , T m );
template < typename T >
T sub_mod ( T a , T b , T m );
template < typename T >
T mul_mod ( T a , T b , T m );
template < typename T >
T pow_mod ( T a , T b , T m );
Usage Example:
const int MOD = 1 e 9 + 7 ;
int result = mul_mod ( 123456789 , 987654321 , MOD);
Fast Modular Operations
Optimized versions for specific moduli.
template < typename T >
T fast_mul_mod ( T a , T b , T m ); // Using __int128
BigInt (Arbitrary Precision)
Supports arithmetic with arbitrarily large integers.
class BigInt {
public:
BigInt ();
BigInt ( long long value );
BigInt ( const string & s );
BigInt operator + ( const BigInt & other ) const ;
BigInt operator - ( const BigInt & other ) const ;
BigInt operator * ( const BigInt & other ) const ;
BigInt operator / ( const BigInt & other ) const ;
BigInt operator % ( const BigInt & other ) const ;
bool operator < ( const BigInt & other ) const ;
bool operator == ( const BigInt & other ) const ;
string toString () const ;
};
Usage Example:
BigInt a ( "123456789012345678901234567890" );
BigInt b ( "987654321098765432109876543210" );
BigInt sum = a + b;
BigInt product = a * b;
cout << sum . toString () << endl;
Complexity:
Addition/Subtraction: O(n)
Multiplication: O(n²) or O(n log n) with FFT
Division: O(n²)
Common Modular Values
// Common moduli in competitive programming
const int MOD1 = 1 e 9 + 7 ; // 1000000007 (prime)
const int MOD2 = 998244353 ; // (prime, NTT-friendly)
const int MOD3 = 1 e 9 + 9 ; // 1000000009 (prime)
Advanced Usage
Checking Division by Zero
bool is_zero_division ( Mint & a ) {
using T = Mint :: T ;
return inverse ( static_cast < T > (a), MOD) < static_cast < T > ( 0 );
}
Using with Combinatorics
Factorial < Mint > fact ( 1 e 6 );
Mint nCr ( int n , int r ) {
if (r < 0 || r > n) return Mint ( 0 );
return fact [n] / ( fact [r] * fact [n - r]);
}
Mint result = nCr ( 100 , 50 );
Fast Power with Mint
Mint result = fastpow ( Mint ( 2 ), 1000000000 );
// Computes 2^1000000000 mod MOD efficiently
Use Compile-time MOD Compile-time modulo is faster than runtime
Precompute Factorials For multiple nCr queries, precompute factorials
Fast Power Use fastpow for exponentiation, not repeated multiplication
Avoid Division Modular division is expensive, minimize usage
Available Implementations
Feature File Notes Mint (Compress) numeric_mint_compress.cppMinimal, fast Mint (Medium) numeric_mint_medium.cppGood balance Mint (Full) numeric_mint_full.cppAll features Fast Power numeric_fastpow.cppBinary exponentiation Modular Ops numeric_mod.cppBasic operations Fast Mod numeric_mod_fast.cppOptimized BigInt numeric_bigint.cppArbitrary precision
See Also
Math Algorithms GCD, primes, and number theory
Combinatorics Use Mint with combinatorial functions