締め切りが 2016/1/14 10:00 AM なので,その 1 分後に公開されるように予約投稿する
2つの自然数の組 (a, b) が与えられたとき、自然数 x, y に関する次の方程式を考えます。
x2 + a2 = y2 + b2 … (※)
例えば、(a, b) = (3, 10) のとき、方程式(※)の解は (x, y) = (10, 3), (46, 45) の 2 組です。
自然数の組 (a, b) に対し、方程式(※)の全ての解の x + y の和を F(a, b) と定義します。
例えば F(3, 10) = 10 + 3 + 46 + 45 = 104 です。
同様に、F(10, 50) = 3500、F(20, 100) = 15022 となることが確かめられます。
標準入力から、半角空白区切りで 2 つの自然数 a, b(1 ≦ a < b ≦ 105)が与えられます。
標準出力に F(a, b) の値を出力するプログラムを書いてください。
探索範囲を効率的に定めて,ブルートフォースで片付ける
f = function(a, b) {
s = 0
b2a2 = b^2-a^2
xmy = 2 - (b2a2 %% 2)
repeat {
xpy = b2a2 %/% xmy
if (xmy*xpy == b2a2) {
x = (xmy+xpy)/2
y = xpy-x
if (x == floor(x) && y > 0) {
s = s+x+y
}
}
if (xmy >= xpy) break
xmy = xmy+2
}
cat(s)
}
f(3, 10) # 104
f(10, 50) # 3500
f(20, 100) # 15022
f(10, 26) # 716
f(11, 389) # 291886
f(123, 456) # 294166
f(35672, 61243) # 5082405064
f(71200, 82321) # 2490724704
f(19126, 98765) # 16043311668
※コメント投稿者のブログIDはブログ作成者のみに通知されます