POJ 1183 反正切函数的应用

問題

自然数aが与えられる。
arctan 1/a = arctan 1/b + arctan 1/cを満たす、ような自然数b,cに対して、
b+cの最小値を求めよ。


ただしarctan (p) + arctan (q) = arctan [(p + q) / (1-pq)]が成り立つ。

制約条件

a≦60000

方針

問題文中で与えられた式にa,b,cを代入すると、
ab+ac-bc+1=0という式が得られる。
b≦cと仮定して一般性を失わない。


上の式をcについて解くとc=(ab+1)/(b-a)≧bが得られる。
これはbについての二次不等式なので、解くと、
a<b≦2aが得られる。


したがって、このような全てのbに対して、cが存在するかを見て、
b+cの最小値を探せば良い。

ソースコード

int main()
{
	int a;
	scanf("%d",&a);
	
	ll ans=1ll<<60;
	for(ll b=a+1;b<=2*a;b++){
		if((a*b+1)%(b-a))continue;
		ll c=(a*b+1)/(b-a);
		ans=min(ans,b+c);
	}
	cout<<ans<<endl;
	
	return 0;
}