目录
1.快速幂
inline long long qupow(long long a, long long b) {
long long ans = 1;
while (b) {
if (b & 1) {
ans = ans * a % P;
}
a *= a % P;
b >>= 1;
}
return ans;
}
2.逆元求组合数
int inv(int a){
return a == 1 ? 1 : (long long)(P - P / a) * inv(P % a) % P;
}
long long C(long long m, long long n){
if (m < 0)
return 0;
if (n < m)
return 0;
if (m > n - m)
m = n - m;
long long up = 1, down = 1;
for (long long i = 0; i < m; i++){
up = up * (n - i) % P;
down = down * (i + 1) % P;
}
return up * inv(down) % P;
}
3.二分
1.二分求第一个>=x的数
inline int search(int x) {
int L = 0, R = n+1;
while (L + 1 < R) {
int M = (L + R) / 2;
if (a[M] < x) {
L = M;
} else {
R = M;
}
}
return a[R];
}
2.二分求第一个>x的数
inline int search(int x) {
int L = 0, R = n+1;
while (L + 1 < R) {
int M = (L + R) / 2;
if (a[M] <= x) {
L = M;
} else {
R = M;
}
}
return a[R];
}