模板大全(转载)
模板
分类: 具体:
最大公约数 (gcd) [#nt01]:
int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}
快速幂 (递归版本) [#nt02]:
ll PowerMod(ll a, ll n, ll m = mod) {
if (!n || a == 1) return 1ll;
ll s = PowerMod(a, n >> 1, m);
s = s * s % m;
return n & 1 ? s * a % m : s;
}
快速幂 (非递归版本) [#nt03]:
ll PowerMod(ll a, int n, ll c = 1) {for (; n; n >>= 1, a = a * a % mod) if (n & 1) c = c * a % mod; return c;}
扩展 Euclid 算法 (exgcd) [#nt04]:
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b) {ll d = exgcd(b, a % b, y, x); return y -= a / b * x, d;}
else return x = 1, y = 0, a;
}
基本预处理 [#nt05]:
// factorials, fact-inverses, unbounded
void init() {
int i;
for (*fact = i = 1; i < N; ++i) fact[i] = (ll)fact[i - 1] * i % mod;
--i, finv[i] = PowerMod(fact[i], mod - 2);
for (; i; --i) finv[i - 1] = (ll)finv[i] * i % mod;
}
// factorials, fact-inverses, bounded
void init(int n) {
int i;
for (*fact = i = 1; i <= n; ++i) fact[i] = (ll)fact[i - 1] * i % mod;
finv[n] = PowerMod(fact[n], mod - 2);
for (i = n; i; --i) finv[i - 1] = (ll)finv[i] * i % mod;
}
// inverses, factorials, fact-inverses, unbounded
void init() {
int i;
for (inv[1] = 1, i = 2; i < N; ++i) inv[i] = ll(mod - mod / i) * inv[mod % i] % mod;
for (*finv = *fact = i = 1; i < N; ++i) fact[i] = (ll)fact[i - 1] * i % mod, finv[i] = (ll)finv[i - 1] * inv[i] % mod;
}
// inverses, factorials, fact-inverses, bounded
void init(int n) {
int i;
for (inv[1] = 1, i = 2; i <= n; ++i) inv[i] = ll(mod - mod / i) * inv[mod % i] % mod;
for (*finv = *fact = i = 1; i <= n