Update include.hh
Signed-off-by: subcrip <contact@subc.rip>
This commit is contained in:
parent
ab39eb6ea8
commit
1629a9f47f
52
include.hh
52
include.hh
|
@ -1,4 +1,6 @@
|
||||||
|
#ifdef ONLINE_JUDGE
|
||||||
#pragma GCC optimize("Ofast")
|
#pragma GCC optimize("Ofast")
|
||||||
|
#endif
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
/**
|
/**
|
||||||
* Useful Macros
|
* Useful Macros
|
||||||
|
@ -18,8 +20,15 @@ constexpr void __() {}
|
||||||
#define __as_typeof(container) decltype(container)::value_type
|
#define __as_typeof(container) decltype(container)::value_type
|
||||||
|
|
||||||
/* type aliases */
|
/* type aliases */
|
||||||
|
#if LONG_LONG_MAX != INT64_MAX
|
||||||
using ll = int64_t;
|
using ll = int64_t;
|
||||||
using ull = uint64_t;
|
using ull = uint64_t;
|
||||||
|
#else
|
||||||
|
using ll = long long;
|
||||||
|
using ull = unsigned long long;
|
||||||
|
#endif
|
||||||
|
using int128 = __int128_t;
|
||||||
|
using uint128 = __uint128_t;
|
||||||
using pii = pair<int, int>;
|
using pii = pair<int, int>;
|
||||||
using pil = pair<int, ll>;
|
using pil = pair<int, ll>;
|
||||||
using pli = pair<ll, int>;
|
using pli = pair<ll, int>;
|
||||||
|
@ -32,6 +41,10 @@ constexpr ll MDL = 1e9 + 7;
|
||||||
constexpr ll PRIME = 998'244'353;
|
constexpr ll PRIME = 998'244'353;
|
||||||
constexpr ll MDL1 = 8784491;
|
constexpr ll MDL1 = 8784491;
|
||||||
constexpr ll MDL2 = PRIME;
|
constexpr ll MDL2 = PRIME;
|
||||||
|
constexpr int128 INT128_MAX = numeric_limits<int128>::max();
|
||||||
|
constexpr uint128 UINT128_MAX = numeric_limits<uint128>::max();
|
||||||
|
constexpr int128 INT128_MIN = numeric_limits<int128>::min();
|
||||||
|
constexpr uint128 UINT128_MIN = numeric_limits<uint128>::min();
|
||||||
|
|
||||||
/* random */
|
/* random */
|
||||||
|
|
||||||
|
@ -158,6 +171,29 @@ template<typename T> ostream& operator<<(ostream& out, const vector<T>& vec) {
|
||||||
for (auto&& i : vec) out << i << ' ';
|
for (auto&& i : vec) out << i << ' ';
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
std::ostream& operator<<(std::ostream& dest, const int128& value) {
|
||||||
|
// https://stackoverflow.com/a/25115163/23881100
|
||||||
|
std::ostream::sentry s( dest );
|
||||||
|
if ( s ) {
|
||||||
|
uint128 tmp = value < 0 ? -value : value;
|
||||||
|
char buffer[ 128 ];
|
||||||
|
char* d = std::end( buffer );
|
||||||
|
do {
|
||||||
|
-- d;
|
||||||
|
*d = "0123456789"[ tmp % 10 ];
|
||||||
|
tmp /= 10;
|
||||||
|
} while ( tmp != 0 );
|
||||||
|
if ( value < 0 ) {
|
||||||
|
-- d;
|
||||||
|
*d = '-';
|
||||||
|
}
|
||||||
|
int len = std::end( buffer ) - d;
|
||||||
|
if ( dest.rdbuf()->sputn( d, len ) != len ) {
|
||||||
|
dest.setstate( std::ios_base::badbit );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
/* pops */
|
/* pops */
|
||||||
#define poptop(q, ...) __AS_PROCEDURE(auto [__VA_ARGS__] = q.top(); q.pop();)
|
#define poptop(q, ...) __AS_PROCEDURE(auto [__VA_ARGS__] = q.top(); q.pop();)
|
||||||
|
@ -182,6 +218,22 @@ ll inverse(ll a, ll b) {
|
||||||
return mod(x, b);
|
return mod(x, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<tuple<int, int, ll>> decompose(ll x) {
|
||||||
|
vector<tuple<int, int, ll>> res;
|
||||||
|
for (int i = 2; i * i <= x; i++) {
|
||||||
|
if (x % i == 0) {
|
||||||
|
int cnt = 0;
|
||||||
|
ll pw = 1;
|
||||||
|
while (x % i == 0) ++cnt, x /= i, pw *= i;
|
||||||
|
res.emplace_back(i, cnt, pw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (x != 1) {
|
||||||
|
res.emplace_back(x, 1, x);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/* string algorithms */
|
/* string algorithms */
|
||||||
vector<int> calc_next(string t) { // pi function of t
|
vector<int> calc_next(string t) { // pi function of t
|
||||||
int n = (int)t.length();
|
int n = (int)t.length();
|
||||||
|
|
Loading…
Reference in New Issue