数学题:
推导公式: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。