【模板】数学
数论
打表
\(\omega\) 为不同质因子个数,\(d\) 为约数个数
\(n\le\) | \(10^1\) | \(10^2\) | \(10^3\) | \(10^4\) | \(10^5\) | \(10^6\) | \(10^7\) | \(10^8\) | \(10^9\) |
---|---|---|---|---|---|---|---|---|---|
\(\max\{\omega(n)\}\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) | \(7\) | \(8\) | \(8\) | \(9\) |
\(\max\{d(n)\}\) | \(4\) | \(12\) | \(32\) | \(64\) | \(128\) | \(240\) | \(448\) | \(768\) | \(1344\) |
\(n\le\) | \(10^{10}\) | \(10^{11}\) | \(10^{12}\) | \(10^{13}\) | \(10^{14}\) | \(10^{15}\) | \(10^{16}\) | \(10^{17}\) | \(10^{18}\) |
---|---|---|---|---|---|---|---|---|---|
\(\max\{\omega(n)\}\) | \(10\) | \(10\) | \(11\) | \(12\) | \(12\) | \(13\) | \(13\) | \(14\) | \(15\) |
\(\max\{d(n)\}\) | \(2304\) | \(4032\) | \(6720\) | \(10752\) | \(17280\) | \(26880\) | \(41472\) | \(64512\) | \(103680\) |
组合数学
线性代数
凸包
求 \(\max_{i}\{kx_{i}+y_{i}\}\)。\(x_{i},y_{i},k\) 为
int
对 \((x_{i},y_{i})\) 建上凸包,查询斜率为 \(-k\) 的直线的最大截距
- 静态建
struct Vec {
LL x,y; Vec(LL x=0,LL y=0):x(x),y(y){}
bool operator < (const Vec &rhs) { return x!=rhs.x ? x<rhs.x : y<rhs.y; }
Vec operator - (const Vec &rhs) { return {x-rhs.x, y-rhs.y}; }
LL operator & (const Vec &rhs) { return x*rhs.y-y*rhs.x; } // 叉乘
};
Vec s[N]; int t = 0;
sort(all(p));
for(auto i : p) {
while( t > 1 && (s[t]-s[t-1]&i-s[t-1]) >= 0 ) --t;
s[++t] = i;
}
- 双指针查询
sort(all(q),[](int x,int y){return k[x]<k[y];});
int j = 1;
for(int i : q) {
auto f=[&](int j) { return k[j]*s[i].x+s[i].y; };
while( j < t && f(j+1) > f(j) ) ++j;
ans[i] = f(j);
}
- 二分查询
拉格朗日插值
\(n+1\) 个点值确定一个 \(n\) 次多项式
\[f(x)=\sum_{i=1}^{n+1}y_{i}\prod_{j\ne i}\frac{x-x_{j}}{x_{i}-x_{j}}
\]