POJ 1183

数学题:

推导公式:p=1/b; q=1/c;然后1/a=(p+q)/(1-pq)=(b+c)/(bc-1);

故:a=(bc-1)/(b+c)。abc都是正整数,bc>1,(这样就好办了,能缩小范围嘛)。(b+c)>2(bc)^(1/2)。b和c应该在根号下2a内。

令b+c=y,则有c=y-b,代入上式得到:y=(b*b+1)/(b-a);再令b-a=t,则b=t+a,代入上式有:y=((t+a)*(t+a)+1)/t=t+(a*a+1)/t+2*a(这里的代换是别人想到的)。

这样,就可以对.y=t+(a*a+1)/t+2*a求导,即:y'=1 - (a*a+1) /(t*t)。当y ' = 0的时候又最小值,但是此时y可不一定是整数,所以要向左和向右找a,

将左右两个数比较就出来了。y的导为0  可得  t等于根号下a方加1.

下面是改造的代码:

 
#include<iostream>
#include<cmath>
using namespace std;
int main(){


	long long a,Minimax,result;
	//long long s=sqrt(a * a +1);  用这个的时候,内存出错。
	cin>>a;
	for (Minimax=a; (a*a+1) % Minimax; Minimax--);   //这里写的比较好
	//for (Minimax = a; Minimax!=s; Minimax--);如果这样写,程序就跑飞了,因为Minimax这个是极大极小值,s可能不是整数,所以就可能跨过s去。
	
	
	result=Minimax+((a*a+1)/Minimax)+2*a;


	cout<<result<<endl;
	return 0;
}
一个小小的题目,竟然也这样麻烦。

数学推导题,题目含金量不在于计算,而在于代换和构思。

如果是我做的话,我首先想到的肯定是暴力了。这样太费时间了。得试多少个数啊。循环多少次,会TLE。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值