[boj] 9020. キム・バッハ予想(node.js)


問題の概要


[boj] 9020. キム・バッハ予想(node.js)
  • 金バッハの推測は整数論の概念の一つであり、「2より大きいすべての偶数は2つの素数の和として表すことができる」.意味
  • で与えられた偶数に対して、Goldバッハの推測を満たす2つの小数をGoldバッハパーティションと呼ぶ場合、与えられた数のGoldバッハパーティションを求める問題.
  • に答える

  • 題に入力範囲が与えられているので,エラトネスのふるいで少数を求めた.cand[인덱스] == 1 이면 소수でインデックス値を並べて区別します.
  • のテストケースについてwhile文で答えます.
  • 所与の数がnの場合、nが複数の黄金バッハパーティションを有する場合、2つの数の差の最小の組合せが出力されるので、インデックスがn/2であることから、少数であるか否かを決定することができる.
  • この場合、小数であれば、nからその小数を減算する数字も小数でなければならないので、この条件を満たすと正解を求めることができる、break
  • .
  • 小数点以下でない場合は、中間値より遠い位置から値を再ナビゲートします.
  • 説明する

    const readline = require("readline");
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    const solution = () => {
      let cand = new Array(10000 + 1).fill(1);
      for (let i = 0; i <= 10000; i++) {
        if (i == 0 || i == 1) {
          cand[i] = 0;
          continue;
        }
        for (let j = 2; i * j <= 10000; j++) {
          if (cand[i * j] == 0) continue;
          cand[i * j] = 0;
        }
      }
      let results = [];
      let T = input();
      for (let i = 0; i < T; i++) {
        let n = Number(input());
        let [a, b] = func(n);
        results.push(a + " " + b);
      }
      console.log(results.join("\n"));
    
      function func(X) {
        let val;
        let mid = Math.floor(X / 2);
        while (!val) {
          if (cand[mid] && cand[X - mid]) {
            val = Math.min(mid, X - mid);
          } else {
            mid--;
          }
        }
        return [val, X - val];
      }
    };
    
    let _line = 0;
    const input = () => stdin[_line++];
    
    let stdin = [];
    rl.on("line", function (line) {
      stdin.push(line);
    }).on("close", function () {
      solution();
      process.exit();
    });

    くどくど言う

  • 題が始まると探索を通じて近づくという迷いが生まれ、何の考えもなくこの熟知した探索を実現した.しかし,コードをもう一度よく調べると,このような近接により,二分探索アルゴリズムのフレームワークwhile文内部で効率的に値の論理を探索できることが分かった.そのため、時間の複雑さがない完璧な体験でした.