Power OJ 2402: Arctan

Power OJ 2402: Arctan

Description

话说上个星期四晚上大家呆在实验室,寅队爆料网上一则冷笑话:男的叫郑璇,女的叫余璇,请问结婚后他们的孩子叫什么?我们现在不管他们的孩子叫郑切还是余切。Kevin只知道自己看过一个如下公式:arctan(1/A)=arctan(1/B)+arctan(1/C),例如当A=1,B=2,C=3时上述等式成立。
现在给定A,我们要求出最小的sum=B+C,使得A,B,C满足上述等式。

Input

输入数据有多组,每组输入一个A(1<=A<=1000000).

Output

输出满足上述等式的最小sum值,(sum=B+C)。

首先我们来分析一下,根据反正切相加(减)定理
在这里插入图片描述
得到A,B,C之间存在如下关系:
BC-AB-AC=1
=>(B-A)C=1+AB
=>C=(1+A
B)/(B-A)
=>C=(1+A(B-A+A))/(B-A)=(A²+1)/(B-A)+A
=>B+C=B+(A²+1)/(B-A)+A
=>B+C=B-A+2A+(A²+1)/(B-A)
不妨设t=B-A;
B+C=t+2
A+(A²+1)/t;
欲求最小sum值,即求t+2A+(A²+1)/t的最小值
又因为t,sum均为整数,所以进行枚举
枚举A²+1的所有不大于sqrt(A²+1)的所有约数,找到最大的约数即可
如果不放心的话可以做比较更新最小t+2
A+(A²+1)/t,因为该函数的(A²+1)/t的影响远大于t本身,所以博主只选择了最大的约数进行考虑。
样例代码如下:

#include <bits/stdc++.h> 
using namespace std;
int main()
{
    long long a,i;
    while(scanf("%lld", &a)!=EOF)
    {
    	for(i=sqrt(a+1);i>=1;i--)
    	{
    		if((a*a+1)%i==0)
    		{
    			printf("%lld\n",a+a+i+(a*a+1)/i);
    			break;
    		}
    	}
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值