反正切函数的应用

· · 题解

题目

个人感觉,这道题不像模拟(可能是我自己理解的不对),更像数学题。

我们可以根据角度和的正切函数公式(正切定理说明任意两条边的和除以第一条边减第二条边的差所得的商等于这两条边的对角的和的一半的正切除以第一条边对角减第二条边对角的差的一半的正切所得的商):

\operatorname{tan}(\alpha +\beta )=\frac{\operatorname{tan}(\alpha )+\operatorname{tan}(\beta )}{1-\operatorname{tan}(\alpha )\times \operatorname{tan}(\beta )}

通过简单的变换得到:

\operatorname{arctan}(p)+\operatorname{arctan}(q)=\operatorname{arctan}(\frac{p+q}{1-p\times q} )

由题面给出的转换得:

\frac{1}{a}=\frac{1}{b}+\frac{1}{c}

根据简单的变形: \frac{1}{a} =\frac{b+c}{b\times c-1} ,令 t=b-a ,以 t=a 为界向左右枚举,找出最小值即可。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    unsigned int a, t, ans1, ans2;
    cin >> a;
    for (t = a; t > 0; t--)
    {
        if ((a*a + 1) % t == 0)
        {
            ans1 = t + 2 * a + (a*a + 1) / t;
            break;

        }

    }
    for (t = a + 1;; t++)
    {
        if ((a*a + 1) % t == 0)
        {
            ans2 = t + 2 * a + (a*a + 1) / t;
            break;
        }
    }
    cout << min(ans1, ans2) << endl;
    return 0;
}