二角函数的性质与应用
前方一本正经的胡说八道警告
会有不严谨的地方
\(\def\bsin{\mathrm{bsin}}\def\bcos{\mathrm{bcos}}\def\btan{\mathrm{btan}}\def\bsec{\mathrm{bsec}}\def\bcsc{\mathrm{bcsc}}\def\bcot{\mathrm{bcot}}\def\barcsin{\mathrm{barcsin}}\def\barccos{\mathrm{barccos}}\def\barctan{\mathrm{barctan}}\def\dbsin{\mathrm{dbsin}}\)
众所周知,角越少,性质越简单,下面我们开始探讨二角函数(bigonometric function)。
由于二维平面上的多边形至少有三个点,所以我们探讨一维数轴上的二边形。
定义二边形 \(AB\) 为一维数轴上 \(AB\) 两点构成的封闭图形,易知 \(AB\) 有两个角 \(\angle AB\) 和 \(\angle BA\),所以二边形也叫二角形(biangle)。
因为一维数轴里无法定义直角,但二角函数对任意二边形都适用,所以我们可以直接定义二角函数。
定义二角正弦函数 \(bsin(\angle AB) = \frac{AB}{BA}\)
因为二角余弦函数的定义和正弦函数相同, \(bcos(\angle AB) = \frac{AB}{BA}\)
正切函数也一样 \(btan(\angle AB) = \frac{AB}{BA}\)
所以\(bsin(\angle AB) = bcos(\angle AB) = btan(\angle AB)\)
所以它们共称二角弦函数(bigonometric chord function)
同样,也很好定义\(bcsc(x), bsec(x), bcot(x)\)等
它们的反函数同样可以定义\(barcsin(x), barccos(x), barctan(x)\)等
可以发现,在几何意义上,对应着三角函数的意义:直角三角形中边的比例,二角函数也有意义:两边之比。
因为一维数轴上无法定义直角,所以二角函数的几何意义对于所有的二角形都成立
此时,如果我们把二边形的边定向,则可以定义有向二角形(directed biangle),同时也可以定义有向二角函数(directed bigonometric function),其记号为二角函数前再加个\(d\),如\(dbsin(x)\)
对于有向二边形里的有向边,它的长度包含了它的方向信息,其中正的为正方向,负的为负方向,易得\(\overrightarrow{AB} = -\overrightarrow{BA}\)
可以发现,二角函数及有向二角函数有广泛的应用
1. A + B Problem
为了简化题目,规定 \(A\) 和 \(B\) 非负
利用二角函数的性质,我们可以在 \(O(\min(A, B))\) 的时间内求出答案
因为边长为 \(0\) 的二边形是不存在的,此时二角函数值是没有意义的(计算机中\(\mathrm{NaN}\)),所以可以作为边界条件以计算
\(C++\) 代码如下:
#include <iostream>
#include <cmath>
struct Biangle {
int x, y; // set x to 0, more convenient
void construct(int len) {
x = 0, y = len;
}
double getBSin() {
double ab = abs(x - y), ba = abs(y - x);
// use bsin(∠AB) = AB / BA
return ab / ba;
}
} ;
int main() {
int A, B;
std::cin >> A >> B;
Biangle ba;
while (true) {
ba.construct(A);
if (std::isnan(ba.getBSin())) break; // not exist
--A, ++B;
}
std::cout << B << std::endl;
return 0;
}
如果使用倍增,可以达到\(O(\log(\min(A, B))\)的复杂度,更加优秀。
2. 错位排列
注意到有向二角函数有优美的性质,因此它可以用来做有向二角函数反演(directed bigonometric function inversion)
下面是一个经典的例子
则
其中\(AB\)是任意二角形
证明略
对于错位排列,我们可以定义 \(f(x)\) 为 \(x\) 个人随意排的方案数,\(g(x)\) 为 \(x\) 个人错位排列方案数,则可以发现
通过枚举有几个人站在了自己的位置上,可以发现
因此轻易地得到了式子
于是就轻易地解决了
代码略
同时,有向二角函数在偏序集上也有它反演的形式,这里不再展开
上面的段落只是对二角函数片面的解释,欢迎提出更深刻的理论
附:感谢\(\textrm{yhx-12243}\),\(\textrm{Weng_Weijie}\)提出的建议