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; }