0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

規則的な数列の和

0
Posted at

今回は paiza の「規則的な数列の和」の問題に挑戦!


問題概要

  • 無限に続く数列A
A = [1, 0, -1, 1, 0, -1, ...]
  • 整数 N, K が与えられ、
  • 数列A の N 要素目から K 要素目までの和 を求める
  • 要素番号は 1 始まり

入力

  • 1 行:整数 N, K
  • 条件:1 ≤ NK ≤ 10^12

出力

  • 区間 [N, K] の要素の総和を 1 行で出力



入力例:

1 1000000000000

出力例:

1






✅OK例:

const rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (line) => {
    const [n, k] = line.split(' ').map(Number);
    let result = 0;

    if (n % 3 === 0) {
        if (k % 3 === 0) {
            result = -1;
        }
    } else if (n % 3 === 1) {
        if (k % 3 !== 0) {
            result = 1;
        }
    } else { // n % 3 === 2
        if (k % 3 === 0) {
            result = -1;
        }
    }

    console.log(result);
    rl.close();
});

🔍 コード全体の流れ

  • 標準入力から NK を受け取る
  • 数列 [1, 0, -1] が 3 個周期で繰り返されることを利用する
  • N % 3K % 3 の組み合わせだけで
  • 区間 N〜K の和が -1 / 0 / 1 のどれかに決まる
  • 条件分岐でその値を直接求めて出力する

NKは1-indexedで与えられる

行ごとの処理の流れ

  • readline を使って 1 行入力を受け取る
  • 入力された文字列を分割して n, k に変換
  • 答え用の変数 result0 で初期化

条件分岐の意味

n % 3 === 0 の場合

  • 区間の開始位置が -1 の位置

  • k % 3 === 0 なら
    → 余分に -1 が 1 回多く含まれる
    result = -1


n % 3 === 1 の場合

  • 区間の開始位置が 1 の位置
  • k % 3 !== 0(区間が 0 で終わらない)なら
    1 が 1 回多く含まれる
    result = 1

n % 3 === 2 の場合

  • 区間の開始位置が 0 の位置
  • k % 3 === 0 なら
    -1 が 1 回多く含まれる
    result = -1

最後に

  • 計算結果 result を出力
  • rl.close() で入力処理を終了



💡 この解法のポイント

  • 実際に足し算は一切していない
  • 「3 個で和が 0」という性質を使い
  • 余る 1 要素だけを見て答えを決めている






📝まとめ

この問題で起きていること

  • 数列は [1, 0, -1] の繰り返し
  • 3 個そろうと必ず和が 0

だから
👉 N〜K のほとんどは打ち消し合う
👉 端っこに余った 1 要素だけが答えを決める


なぜ「N % 3K % 3 だけ」で決まる?

  • N がどの値(1 / 0 / -1)から始まるか
  • K がどこで終わるか

この 始点と終点のズレだけで、「余る 1 個」が

  • 1
  • -1
  • 何も余らない(0

のどれかに決まるから。

条件分岐を「数列の位置」で見る

n % 3 === 0
→ 位置: -1 からスタート

k%3==0 で終わると
-1 が 1 回多く残る
-1


n % 3 === 1
→ 位置: 1 からスタート

k0 で終わらなければ
1 が 1 回多く残る
+1


n % 3 === 2
→ 位置: 0 からスタート

k%3==0 なら
-1 が 1 回余る
-1


なぜ result = 0 が初期値?

条件に当てはまらない場合は
👉 完全に 3 個セットで消える

つまり何も余らない
だから 0 のままで正解

一言で言うと

「3 個で 0 になる数列だから、
全体は無視して "余る 1 個" だけを見る」

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?