プログラマー:カーペット


(質問リンク)

質問する


Leoはじゅうたんを買いに行きました.格子じゅうたんの列が見えました.真ん中は黄色で、一列は茶色で、下図のように見えます.

Leoは家に帰ってから、さっき見たじゅうたんの黄色と茶色の格子数を覚えたが、じゅうたん全体の大きさは覚えていない.
Leoがカーペットに茶色の格子数brown,黄色の格子数yellowをパラメータとして与えた場合,カーペットの横寸法と縦寸法を順番に並べて返す解法関数を記述してください.
せいげんじょうけん
  • 茶色の格子数brownは8以上5000以下の自然数である.
  • 黄色のメッシュの数yellowは、200000を超える自然数である.
  • カーペットの横方向の長さは、縦方向の長さ以上である.
  • I/O例
    brownyellowreturn102[4, 3]81[3, 3]2424[8, 6]

    に答える


    どのじゅうたんも縁が茶色に塗られているだけだ.
    中間黄色部分の横方向の長さがxであり、縦方向の長さがyである場合、カーペット全体の横方向の長さはx+2であり、縦方向の長さはy+2である.

    黄色部分とカーペット全体の幅は、それぞれ以下のようにすることができる.
  • xy=yellowxy = yellowxy=yellow
  • (x+2)(y+2)=brown+yellow(x+2)(y+2) = brown + yellow(x+2)(y+2)=brown+yellow
  • 1番からxyの候補者がyellowの約数集合であることがわかる.
    例えば、yellowが24である場合、xおよびyの候補者は以下のようになる.
    xy2411228364
    この候補者の中で、2番の食事を満たす値を見つけて返却すればいい.
    黄色sqrt{yellow}yellowは、正解が繰り返されると返されるため、実行時間は長くありません.
    ソースコード
    function solution(brown, yellow) {
        // yellow의 약수 중 답이 되는 값만 return
        for (let i=1; i<=Math.sqrt(yellow); i++) {
            if (yellow%i === 0 && brown+yellow === (yellow/i+2)*(i+2))
                return [yellow/i+2, i+2];
        }
    }