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?

More than 3 years have passed since last update.

AtCoderログ:0115 - ABC 116 B

Last updated at Posted at 2021-09-17

問題

問題文

数列 $a=\{a_1,a_2,a_3, \ldots \}$ は、以下のようにして定まります。
・初項 $s$ は入力で与えられる。
・関数 $f(n)$ を以下のように定める: $n$ が偶数なら $f(n)=n/2$、$n$ が奇数なら $f(n)=3n+1$。
・$i=1$ のとき $a_i=s$、$i>1$ のとき $a_i=f(a_{i−1})$ である。
このとき、次の条件を満たす最小の整数 $m$ を求めてください。
・$a_m=a_n~(m>n)$ を満たす整数 $n$ が存在する。

制約

・$1 \le s \le 100$
・入力はすべて整数である。
・$a$ のすべての要素、および条件を満たす最小の $m$ は $1000000$ 以下となることが保証される。

収録されている問題セット

回答

回答1 (AC)

数式が多いため難しく見えますが,要は数列を計算し、はじめて同じ値になるようなインデックスの値 $m$ を求めれば良いです。コードは以下のようになりました。今回は $m \le 1000000$ であることがわかっているので、数列に登場したかどうかを配列でチェックしています。

abc116b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int s;
  cin >> s;

  int counter = 1;
  vector<bool> c(1000001,false);
  c.at(s) = true;
  while ( true ) {
    if ( s%2==0 ) {
      s = s/2;
    } else {
      s = 3*s+1;
    }
    counter += 1;
    if ( c.at(s)==true ) {
      break;
    } else {
      c.at(s) = true;
    }
  }
  cout << counter << endl;
}

なお、設問が使用した関数 $f(n)$ に対し、どのような初期値 $s$ を入力しても数列の値が最終的には 1 になる (より正確には 4→2→1→4→... というループになる)ことが予想されています (Collatz 予想(または角谷予想))。つまり、従って、このループ以外では数列に同じ値が登場しないことがわかります (同じ値が登場したらそこでループしてしまい、4→2→1のループにならないため)。

調べたこと

AtCoder の解説ユーザ解説

計算した値を set 型変数に保持していました。

AtCoder の解説コンテスト全体の解説

回答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?