洛谷 5695 [NOI2001]反正切函数的应用

题目

问给定的每一个\(a\),是否存在正整数\(b,c\)
使得在满足\[\arctan(\frac{1}{a})=\arctan(\frac{1}{b})+\arctan(\frac{1}{c})\]的情况下让\(b+c\)最小,并求出\(b+c\)


分析

因为题目中提到\[arctan(p)+arctan(q)=arctan(\frac{p+q}{1-pq})\],所以也就是找到一种情况使\[\frac{1}{a}=\frac{\frac{1}{b}+\frac{1}{c}}{1-\frac{1}{bc}}\]
化简得到\(\frac{1}{a}=\frac{b+c}{bc-1}\)
但是关键是要把\(b+c\)\(a\)\(b,c\)中任意一个表示,
那么考虑先表示\(c\),那么\[c=\frac{ab+1}{b-a}\]
那么\[b+c=b+\frac{ab+1}{b-a}\]
考虑要把\(b\)变成一次项,那么\[b+c=\frac{b^2-ab+ab+1}{b-a}=\frac{b^2+1}{b-a}\]
\[=\frac{b^2-a^2+a^2+1}{b-a}=b+a+\frac{a^2+1}{b-a}=(b-a)+\frac{a^2+1}{b-a}+2a(2a为常数)\]
那就是\(y=ax+b/x\)对勾函数,那我只能用一个初中生能够脑补的开根号来解决,而且\(a^2+1\)应该是\(b-a\)的倍数,所以结果就出来了


代码

#include <cstdio>
#define rr register
using namespace std;
int A,a; long long t;
signed main(){
    scanf("%d",&a),A=a;
    for (t=1ll*a*a+1;t%A;++A); A+=a;
    return !printf("%lld",A+(1ll*a*A+1)/(A-a));
}

猜你喜欢

转载自www.cnblogs.com/Spare-No-Effort/p/12109890.html
今日推荐